public static class ConnectionPool
{
private static object locker = new object()
private static Dictionary<string, SqlConnection>Connections = null
public static SqlConnection GetConnection<T>() where T : class, new()
{
string databaseName = NA.Common.Extensions.GetDatabaseName<T>()
if (string.IsNullOrEmpty(databaseName))
return null
if (Connections == null)
{
lock (locker)
{
Connections = new Dictionary<string, SqlConnection>()
}
}
string connKey = FindFreeSqlConnection(databaseName)
if (connKey != null)
return Connections[connKey]
else
{
string strconn = NA.Common.Extensions.GetConnectionString<T>()
int poolSize = NA.Common.Extensions.GetConnectionPoolSize<T>()
lock (locker)
{
for (int i = 0i <poolSize++i)
{
SqlConnection conn = new SqlConnection(strconn)
conn.Open()
Connections.Add(databaseName + "_" + i.ToString(), conn)
conn.Close()
}
}
return Connections[FindFreeSqlConnection(databaseName)]
}
}
private static string FindFreeSqlConnection(string databaseName)
{
IEnumerable<string>connKeys = Connections.Keys.Where(item =>item.StartsWith(databaseName))
if (connKeys != null &&connKeys.Count() >0)
{
foreach (string key in connKeys)
{
if (Connections[key].State == ConnectionState.Closed)
return key
}
}
return null
}
}
附加上其中用到的三个方法:
internal static int GetConnectionPoolSize<T>() where T : class, new()
{
string database = GetDatabaseName<T>()
string[] poolSizeArray = ConfigurationManager.AppSettings["ConnectionsPoolSize"].Split('|')
if (poolSizeArray != null)
{
foreach (string sizeItem in poolSizeArray)
{
string[] sizeItemArray = sizeItem.Split(':')
if (database == sizeItemArray[0])
return int.Parse(sizeItemArray[1])
}
}
return 50
}
public static string GetConnectionString<T>() where T : class, new()
{
string tableName = GetTableName<T>()
string[] databaseArray = ConfigurationManager.AppSettings["DatabaseArray"].Split('|')
if (databaseArray != null)
{
foreach (string database in databaseArray)
{
string tableNameList = ConfigurationManager.AppSettings[database]
string[] tables = ConfigurationManager.AppSettings[database].Split('|')
if (tables != null &&tables.Length >0)
if (tables.Contains(tableName))
return ConfigurationManager.ConnectionStrings[database].ConnectionString
}
}
return string.Empty
}
public static string GetDatabaseName<T>() where T : class, new()
{
string tableName = GetTableName<T>()
string[] databaseArray = ConfigurationManager.AppSettings["DatabaseArray"].Split('|')
if (databaseArray != null)
{
foreach (string database in databaseArray)
{
string tableNameList = ConfigurationManager.AppSettings[database]
string[] tables = ConfigurationManager.AppSettings[database].Split('|')
if (tables != null &&tables.Length >0)
if (tables.Contains(tableName))
return database
}
}
return string.Empty
}
先检查一下datareader是不是一定在用完就关了(最好用using来处理),或者在程序中就不要用datareader来读取数据,换成其它的dataset之类的,如果一定要用datareader可以用lock之类的锁定代码段,另外在高版本的sql server上也支持一个连接下多个datareader,见http://hi.baidu.com/dxawddd/item/5b6b2c0aba6ac98a03ce1b75加个判断
if (SqlHelper.connection.State == System.Data.ConnectionState.Closed)SqlHelper.connection.Open()
else (SqlHelper.connection.State == System.Data.ConnectionState.Broken)
{
SqlHelper.connection.Close()
SqlHelper.connection.Open()
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)