C# 数据库连接池

简单介绍连接池机制:

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

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值