C#数据库连接池 [转]
using System.Data.SqlClient;
using System.Collections;
/// <summary>
/// ConnectionPool 的摘要说明
/// </summary>
public class ConnectionPool
{
private static ConnectionPool cpool = null;//池管理对象
private static Object objlock = typeof(ConnectionPool);//池管理对象实例
private int size = 10;//池中连接数
private int useCount = 0;//已经使用的连接数
private ArrayList pool = null;//连接保存的集合
private String ConnectionStr = "";//连接字符串
public ConnectionPool()
{
//
// TODO: 在此处添加构造函数逻辑
//
ConnectionStr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
size = 100;
pool = new ArrayList();
}
//创建获取连接池对象
public static ConnectionPool getPool()
{
lock (objlock)
{
if (cpool == null)
{
cpool = new ConnectionPool();
}
return cpool;
}
}
//获取池中的连接
public SqlConnection getConnection()
{
lock (pool)
{
SqlConnection tmp = null;
if (pool.Count > 0)
{
tmp = (SqlConnection)pool[0];
pool.RemoveAt(0);
//不成功
if (!isUserful(tmp))
{
//可用的连接数据已去掉一个
useCount--;
tmp = getConnection();
}
}
else
{
//可使用的连接小于连接数量
if (useCount < size)
{
try
{
//创建连接
SqlConnection conn = new SqlConnection(ConnectionStr);
conn.Open();
useCount++;
tmp = conn;
}
catch (Exception e)
{
}
}
}
return tmp;
}
}
//关闭连接,加连接回到池中
public void closeConnection(SqlConnection con)
{
lock (pool)
{
if (con != null)
{
pool.Add(con);
}
}
}
//目的保证所创连接成功,测试池中连接
private bool isUserful(SqlConnection con)
{
//主要用于不同用户
bool result = true;
if (con != null)
{
string sql = "select 1";//随便执行对数据库操作
SqlCommand cmd = new SqlCommand(sql, con);
try
{
{
cmd.ExecuteScalar().ToString();
}
catch
{
result = false;
}
}
return result;
}
}
//使用连接后的连接获取方法
//获取连接时,就不用创建连接直接从池中获取数据
string strsql = "select * from Chapter";
SqlDataAdapter sqldap = new SqlDataAdapter(strsql, ConnectionPool.getPool().getConnection());
DataSet set = new DataSet();
sqldap.Fill(set);
GridView1.DataSource = set.Tables[0].DefaultView;
GridView1.DataBind();