简单介绍连接池机制:
1.项目启动时创建好初始数目的数据库连接,初始为空闲状态!这部分连接将永远不会断开,直到你的应用程序退出运行!2.当某个类要使用连接时,到连接池中随机找寻一个空闲状态的连接给此类使用,此时修改该连接状态为使用,此状态告诉其他类将不能再使用该连接,直到该连接重新被置成空闲状态!
3.当该类使用完该连接以后调用close方法将该连接归还连接池,将状态修改为空闲状态!此处的close方法并不是真正的关闭连接,而是将连接放回到连接池中.
4.当连接池中所有的连接都被使用,而又有新的使用连接请求时,那么连接池会自动去创建一个新的连接供使用,该新连接使用完后不会被断开,将永久留在连接池中.此时连接池中连接的数目将增加一个.
5.直到连接池中的连接数目达到配置的最大数目,并且所有的连接都在被使用时,再有新的要使用连接的请求才会处于等待状态.但一般情况下该情况几乎不会发生.因为所有的地方同一时刻使用连接的并发几率很小!所以根据自己项目中并发情况来设置连接池中连接的数目.
6.连接池里的连接在使用完后,必须调用相应的close方法将连接归还到连接池当中,这样才能保证连接池正常使用.否则长时间不归还连接会导致连接池无可用连接,从而导致应用无法操作.
出自:http://bbs.csdn.net/topics/190123150
多线程连接数据库的连接池类: 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 = 0; i < 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; }
出自:http://zhidao.baidu.com/question/195369794.html?qbl=relate_question_0&word=%D2%BB%B8%F6%CA%FD%BE%DD%BF%E2%C1%AC%BD%D3%20%B6%E0%CF%DF%B3%CC%B9%B2%D3%C3&optimi=4
另高效方案 http://wenku.baidu.com/link?url=inBut60416KEjmF0JSdCDGL3DSyrXAeJpFf1vPlGW8cVz_AyIuA8OSPjfXxueX8xkJILdHMz7reBxUO7DcHuRdkOu0MAFKwTXxF2uDH7aPa