修改了个数据库连接池。你门看能不能用。这个项目想用。

zkjbeyond 2004-04-01 05:45:31
c# 的同步实现上和java有什么不同

using System;
using System.Collections;
using System.Data.SqlClient;
using System.Data;

namespace SqlDataUtil
{
/// <summary>
/// DBConnectionManager 的摘要说明。
/// </summary>
public class DBConnectionManager
{
private static bool initialized = false;
/// <summary>
/// 连接池的数据库连接
/// </summary>
private static Hashtable pool;
/// <summary>
/// 连接池中允许存放的最大数据库连接数
/// </summary>
private static int maxConnNum = 5;
/// <summary>
/// 当连接池中的空闲数据库连接数不足时,每次允许连接池增加的数据库连接数
/// </summary>
private static int incrementNum = 2;
/// <summary>
/// 连接池在被创建时,允许生成的初始数据库连接数
/// </summary>
private static int initialConnNum = 3;
/// <summary>
/// 连接数据库的连接参数
/// </summary>
private static String url="Server='packard';UID=sa;password=richway;Database='建管web'";

private static bool haserror = false; //连接池是否初始化成功标志,false初始化成功,反之失败
private static ArrayList useConnections = ArrayList.Synchronized(new ArrayList()); //存放已经被使用的数据库连接的向量记录器
public static SqlConnection getConnection()
{
/* 如果连接池没有被初始化,首先初始化连接池 */
if (!initialized)
{
initializePool();
if (!initialized)
{
return null;
}
}
SqlConnection conn = null; //需要返回的连接,初始值为空
while (conn == null)
{
//得到连接池中的所有连接
System.Collections.ICollection conns = pool.Keys;
//得到连接池的大小
int connNum = pool.Count;

foreach(SqlConnection item in conns)
{
conn=(SqlConnection)item;
int b = (int)pool[item];
if (b == 0)
{
//得到一个空闲连接,并且将该连接写入已用连接向量记录器
//pool.Add(conn, 1);
pool[conn]=1;
useConnections.Add(conn);
return conn;
}
}

/* 如果在连接池中没有找到空闲的数据库连接并且当前连接池的
* 大小小于连接池中允许存在的最大数据库连接数,则创建适当的新的数据库连接
* 增加到连接池中,其个数为在连接池初始化时定义好的incrementNum
*/
if (connNum < maxConnNum)
{

for (int i = 0; i < incrementNum && connNum < maxConnNum; i ++)
{
try
{
conn = new SqlConnection(url);
pool.Add(conn, 0);
connNum ++;
}
catch (Exception)
{
return null;
}
}
/* 返回一个刚刚创建的数据库连接并且将该连接写入已用连接向量记录器 */
pool[conn]=1;
useConnections.Add(conn);
return conn;
}
/* 如果连接池中仍然没有可以使用的空闲连接则释放一个最早被
* 使用的数据库连接,并且递归调用该函数本身将刚刚释放的连接返回
*/
//释放一个最早被使用的数据库连接

returnConnection((SqlConnection)useConnections[0]);


//递归调用函数getConnection
conn = getConnection();
//程序的原意设计为等待使用连接池的其他程序自主释放连接,并得到空闲连接
//该方法被注释,不采用
// try {
// pool.wait();
// } catch (Exception ex) {
// ex.printStackTrace();
// }
}
/* 以上处理如果全部失败,则返回一个空连接
* 按数据库连接失败处理
*/
return null;
}
private static void initializePool()
{
//实例化连接池变量pool
pool = Hashtable.Synchronized(new Hashtable());

//初始化连接池,将连接池中的数据库空闲连接数设为初始值
for (int i = 0; i < initialConnNum; i ++)
{
try
{
pool.Add(new SqlConnection(url),0);
}
catch (Exception)
{
haserror = true;
break;
}
}
//连接池初始化成功
if (!haserror)
initialized = true;
}
/**
* 在连接池中释放一个正在被使用的连接
* 该函数可以将由于客户端原因造成的没有被释放的数据库连接被释放
* 将该数据库连接置为空闲,放回到连接池当中
* 输入参数是一个数据库连接
* 返回值是空连接
*/
public static SqlConnection returnConnection(SqlConnection conn)
{

if (conn == null)
{
return null;
}

pool[conn]=0;
//pool.notify();
return null;
}
/**
* 将连接池中的空闲数据库连接关闭
* 无输入参数
* 无返回值
*/
public static void clearPool()
{
if (pool == null)
{
return;
}
ICollection conns = pool.Keys;
foreach(SqlConnection conn in conns)
{
int b = (int) pool[conn];
if (b == 0)
{
try
{
conn.Close();
}
catch (Exception)
{
}
}
}
}
}
}
...全文
116 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
listhome 2004-04-29
  • 打赏
  • 举报
回复
UP
zkjbeyond 2004-04-29
  • 打赏
  • 举报
回复
有人顶一下揭贴了

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧