关于数据库连接池的问题和思考

发表于:2012-12-05 10:15

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:xiaoxinla的专栏    来源:51Testing软件测试网采编

  最近数据中心出了一些问题,在Mysql连接上出现了连接数量不足的问题,一时也没找到原因,然后只是找到了解决方法,因为之前程序的错误,在打开数据库之后忘记了关闭数据库,才造成了这样的问题。在这里也要提醒各位,特别是使用try......catch......这样的容错处理时,一定要记得执行Finally语句,在Finally中关闭数据库。

  今天在网上搜了一下午,才找到了一些头绪,然后总结下来,供大家参考:

  数据库有自己的连接池,例如Mysql,当一种编程语言要使用Mysql数据库时,Mysql公司会编写这种语言的数据库驱动,例如vb.net的Mysql驱动,所以,当vb.net连接mysql时,mysql就建立了自己的连接池,连接池的个数与连接的字符串有关。

  在你的程序初始化的时候,当第一次连接数据库时,mysql将根据完全匹配算法创建连接池,该算法将池与连接中的 连接字符串关联,每个连接池与不同的连接字符串关联。打开新连接时,如果连接字符串与现有池完全匹配,mysql就不会建立新的连接池;如果连接字符串与现有池不完全匹配,mysql就将创建一个新池,按进程、按应用程序域、按连接字符串以及(在使用集成的安全性时)按 Windows 标识来建立池连接。其实,所有的数据库都是这样。因为这种逻辑关系是一种很好的解决数据库连接问题的方法,在平时,我们也可以使用这种逻辑关系编写自己的软件。

  在以下 C# 示例中创建了三个新的 SqlConnection 对象,但是管理时只需要两个连接池。注意,根据为 Initial Catalog 分配的值,第一个和第二个连接字符串有所不同。

using (SqlConnection connection = new SqlConnection(
  
"Integrated Security=SSPI;Initial Catalog=Northwind"))
    {
        connection.Open();      
        
// Pool A is created.
    }

using (SqlConnection connection = new SqlConnection(
  
"Integrated Security=SSPI;Initial Catalog=pubs"))
    {
        connection.Open();      
        
// Pool B is created because the connection strings differ.
    }

using (SqlConnection connection = new SqlConnection(
  
"Integrated Security=SSPI;Initial Catalog=Northwind"))
    {
        connection.Open();      
        
// The connection string matches pool A.
    }

  上面的代码是我摘抄下来的,懒的自己写了,就使用别人的了。

  最后,当我们在使用Connection 对象的 Close 或 Dispose 方法关闭数据库时,并不是真正的断开了与数据库之间的连接,只是将连接返回给了池。就相当于“一个用户”定义了100把铁锹,“我”可以去借,“他”也可以去借,这里”一个用户“就相当于数据库,“我”,“他”就是不同的池,如果“我”借了90把铁锹不还的话,那么“他”就只能借10把了。但是比较可悲的是,如果我借了100把,没有还的话,别人就没法借用了,数据库就会报出连接不足的问题,”还铁锹“最好的办法就是使用Connection 对象的 Close 或 Dispose 方法。

  上面只是我自己的理解,如果有什么不对的地方,欢迎大家指出。

《2023软件测试行业现状调查报告》独家发布~

精彩评论

  • mvvztt
    2012-12-05 11:01:51

    倒数第二段中,第一句和最后一句好像矛盾,还是说我没看明白?到底怎么样才能真正断开与数据库的连接呢?

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号