【IT168 技术文档】21世纪什么最贵?数据库连接。对于以数据库做数据存储基石的应用系统来说,数据库连接是整个系统中最珍贵的资源之一。数据库连接池是为了更有效地利用数据库连接的最重要措施。它对于一个大型的应用系统的性能至关重要,特别是Web应用。ADO.NET Data Provider(以下简称Data Provider)会帮我们管理连接池,所以有人说使用连接池就像游儿童池一样轻松。但并不是说有了Data Provider程序员就万事无忧的,不正确地使用连接池可能导致你的应用在池里淹死。笔者希望通过本文能让读者彻底明白连接池的重要性以及能根据实际情况正确配置连接池的参数,明白实际应用中出现的连接泄漏、“死连接”等异常情况和应对方法,让应用轻松畅游连接池。本文主要介绍ADO.NET 1.1的连接池。

1、什么是连接池

连接池是Data Provider提供的一个机制,使得应用程序使用的连接保存在连接池里而避免每次都要完成建立/关闭连接的完整过程。要理解连接池,先要理解程序里SqlConnection.Open()、SqlConnection.Close()和打开/关闭一个“物理连接”的关系。

Data Provider在收到连接请求时建立连接的完整过程是:先连接池里建立新的连接(即“逻辑连接”),然后建立该“逻辑连接”对应的“物理连接”。建立“逻辑连接”一定伴随着建立“物理连接”。Data Provider关闭一个连接的完整过程是先关闭“逻辑连接”对应的“物理连接”然后销毁“逻辑连接”。销毁“逻辑连接”一定伴随着关闭“物理连接”。SqlConnection.Open()是向Data Provider请求一个连接,Data Provider不一定需要完成建立连接的完整过程,可能只需要从连接池里取出一个可用的连接就可以;SqlConnection.Close()是请求关闭一个连接,Data Provider不一定需要完成关闭连接的完整过程,可能只需要把连接释放回连接池就可以。

下面以一个例子来说明。本文例子都使用Console Application。我们使用操作系统的性能监视器来比较使用连接池与否,数据库的“物理连接”数量的不同。因为性能监视器至少每一秒采集一次数据,为方便观察效果,代码中Open和Close连接后都Sleep一秒。

SqlConnection con=new SqlConnection("server=.;

database=northwind;pooling=false;trusted_connection=true");

for(inti=0;i<10;i++)

{

try

{

con.Open();

System.Threading.Thread.Sleep(1000);

}

catch(Exception e){Console.WriteLine(e.Message);}

finally

{

con.Close();

System.Threading.Thread.Sleep(1000);

}

}

首先,不使用连接池做测试。以上程序中pooing = false表示不使用连接池,程序使用同一个连接串Open & Close了10次连接,使用性能计数器观察SQL Server的“物理连接”数量。从下面的锯齿图可以看出每执行一次con.Open(),SQLServer的“物理连接”数量都增加一,而每执行一次con.Close(),SQLServer的“物理连接”数量都减少一。由于不使用连接池,每次Close连接的时候Data Provider需要把“逻辑连接”和“物理连接”都销毁了,每次Open连接的时候Data Provider需要 建立“逻辑连接”和“物理连接”,锯齿图因此而成。

图1

下面启用连接池再测试一次。把连接串的pooling参数改为true,另外在for循环后加上Console.Read()。

从下图可以看出,从第一次Open到第执行完Console.Read()这段时间内,SQL Server的“物理连接”数量一直保持为1,直到关闭console应用程序的进程后SQL Server的“物理连接”数量才变为0。由于使用了连接池,每次Close连接的时候Data Provider只需把“逻辑连接”释放回连接池,对应的“物理连接”则保持打开的状态。每次Open连接的时候,Data Provider只需从连接池取出一个“逻辑连接”,这样就可以使用其对应“物理连接”而不需建立新的“物理连接”,直线图因此而成。

图2

在ADO.NET 1.1下使用性能计数器观察连接池有关计数器需要注意两个bug。

(1)当应用程序进程关闭后,计数器“SqlClient: Current # pooled connections”和“SqlClient: Current # connection pools”不会减为0,所以每重新运行一次应用程序性能计数器的值在上次的值的基础上一直累加。这是计数器的错误显示,实际上当应用程序关闭后connection pool和pooled connection就减为0。因为关闭应用程序后把性能监视器也关闭,重启应用程序后再重新打开性能监视器就可以看出“SqlClient: Current # pooled connections”和“SqlClient: Current # connection pools”是重新从0开始上升的。

(2)用断点调试的情况下,连接串为"server = .;database = northwind;pooling = true;trusted_connection = true" 的connnection第一次Open的时候“SqlClient: Current # pooled connections”就从0变为2。但根据连接串参数的意义,只Open了一个connection,“SqlClient: Current # pooled connections”应该从0变为1(图2是在没有断点调试的情况下得出的曲线)。这不是计数器显示错误,而是ADO.ENT 1.1本身的bug,因为“User Connections”也随着“SqlClient: Current # pooled connections”从0变为2。

为什么需要连接池?

完成建立/关闭一个连接的完整过程是一个消耗大量资源和时间的一个过程。想象一下一个ASP.NET的系统,里面包含大量访问数据库的代码片,系统有大量的用户同时在使用系统,如果程序每次Open/Close一个连接Data Provider都完成建立/关闭一个连接的完整过程,这样的系统性能肯定让人无法接受。

Data Provider提供连接池并通过连接池实现“物理连接”重复使用而避免频繁地建立和关闭“物理连接”,从而大大提高应用系统的性能。图1描述一个应用的不同Client App使用连接池访问数据库,Data Provider负责建立和管理一个或者多个的连接池,每一个连接池里有一个或者多个连接,池里的连接就是“逻辑连接”。连接池里有N个连接表示该连接池与数据库之间有N个“物理连接”。增加一个连接,连接池与数据库的“物理连接”就增加一个,减少一个连接,连接池与数据库的“物理连接”就减少一个。

图3

ado.net mysql 连接池_ADO.NET数据连接池相关推荐

  1. JMeter连接mysql数据库,并查找数据

    JMeter连接mysql数据库,并查找数据 连接mysql数据库 数据查找 连接mysql数据库 1.下载mysql的jar驱动,https://mvnrepository.com/artifact ...

  2. 移动开发:Android数据连接浅析

    在Android中,应用对数据连接的操作需要通过framework提供的以下两个服务类frameworks/base/services/java/com/android/server/Connecti ...

  3. Android数据连接浅析

    在Android中,应用对数据连接的操作需要通过framework提供的以下两个服务类frameworks/base/services/java/com/android/server/Connecti ...

  4. AndroidQ_默认数据连接的建立

    默认数据连接创建 创建默认数据连接有两种方式: 开机初始化(需要Settings默认数据开关是打开的) 用户从Settings UI上手动打开 一, 开机default Data建立的过程: Phon ...

  5. ado.net mysql 连接池_ADO.NET数据库连接池的介绍 | 学步园

    摘录自MSDN: 建立池连接可以显著提高应用程序的性能和可缩放性.SQL Server .NET Framework 数据提供程序自动为 ADO.NET 客户端应用程序提供连接池.您也可以提供几个连接 ...

  6. ado.net mysql 连接池_ADO.NET中SQL Server数据库连接池

    实际上,大多数应用程序仅使用一个或几个不同的连接配置. 这意味着在执行应用程序期间,许多相同的连接将反复地打开和关闭. 为了使打开的连接成本最低,ADO.NET 使用称为连接池的优化方法. 连接池减少 ...

  7. mysql怎么连接数据连接池_Mysql数据库连接池

    一 开源数据连接池 1 dbcp dbcp可能是使用最多的开源连接池,原因大概是因为配置方便,而且很多开源和tomcat应用例子都是使用的这个连接池吧. 这个连接池可以设置最大和最小连接,连接等待时间 ...

  8. asp.net mysql 连接池_asp.net 使用数据库连接池

    数据库连接数过万的真相,原来我们错怪阿里云RDS了 在一次数据库连接问题中,我们坚持认为数据库连接数过万是阿里云RDS的问题,但后来阿里云提供了当时的数据库连接情况,让我们动摇了自己的想法. 上面这5 ...

  9. JdbcTemplate(1)(数据连接池)

    一.环境准备 1.1 导入JAR包 ①IOC容器所需要的JAR包 commons-logging-1.1.1.jar spring-beans-4.0.0.RELEASE.jar spring-con ...

最新文章

  1. ACMNO.17C语言-筛法求素数 用筛法求之N内的素数。
  2. 使用Categorical_endcoder包对标称变量进行个性化编码
  3. linux shell 小数计算
  4. poj 3522(最小生成树应用)
  5. python 事务操作_Python实现连接mysql数据库及事务处理【冰斌棒】
  6. 电子信息工程考研专业c语言,电子信息专业考研专硕考什么
  7. 大学生面试 4个问题千万别撒谎
  8. linux 追加多行文件,linux每行追加内容
  9. 应用使用Druid连接池经常性断链问题分析
  10. 配置OSPF实现pc机互通小实验
  11. Linux下PhysX3.4编译和环境搭建
  12. Python使用opencv打开笔记本摄像头时遇到的问题及解决办法
  13. 计算机国际会议开幕词,国际学术会议开幕词.doc
  14. 做人得厚道,不是么?
  15. 《良乔说软件》第一回 问君情深深几许?我的眼里只有你
  16. vb怎么抓取html的class,VB6.0获取网页源代码
  17. 你知道公司做哪个体系的认证更适合吗?
  18. 计算机网络复习(下)
  19. Qlik Sense常用函数
  20. 【swift】swift quick start

热门文章

  1. Win11系统点击回滚没有反应是怎么回事
  2. windows7如何实现屏幕不休眠
  3. win7电脑假死机怎么办
  4. 我的webpack配置文件
  5. 学习Spring Boot:(六) 集成Swagger2
  6. Collections.synchronizedList使用
  7. java运动员最佳配对_运动员最佳配对问题 - osc_y1pyjby5的个人空间 - OSCHINA - 中文开源技术交流社区...
  8. python爬去百度百科词条_python简单爬虫爬取百度百科python词条网页
  9. linux 命令行看图片,骚操作:用终端打开图片
  10. spring批量写入mysql数据库_MyBatis-spring和spring JDBC批量插入Mysql的效率比较