ado.net mysql 连接池_ADO.NET数据连接池

【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一秒。

None.gifSqlConnection con=new SqlConnection("server=.;

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

None.gif

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

None.gif {

None.gif try

None.gif {

None.gif con.Open();

None.gif System.Threading.Thread.Sleep(1000);

None.gif }

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

None.gif finally

None.gif {

None.gif con.Close();

None.gif System.Threading.Thread.Sleep(1000);

None.gif }

None.gif }

None.gif

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

d21fa74a2dcccb2e8a46f5ac6459d796.png

图1

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

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

29f2e9c26e0b3411af64c98dff3df4b1.png

图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个“物理连接”。增加一个连接,连接池与数据库的“物理连接”就增加一个,减少一个连接,连接池与数据库的“物理连接”就减少一个。

279aab88e569f610360be48d43adbc66.png

图3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【youcans 的 OpenCV 例程200篇】170.图像分割之K均值聚类

【OpenCV 例程200篇】 系列&#xff0c;持续更新中… 【OpenCV 例程200篇 总目录-202205更新】 【youcans 的 OpenCV 例程200篇】170.图像分割之K均值聚类 5. 区域分割之聚类方法 5.1 基于 k 均值聚类的区域分割 聚类方法的思想是将样本集合按照其特征的相似性划分为若干类别…

计算名次和奖学金

使用Java的switch的判断计算学生的名次和对应的奖学金&#xff0c;根据文本提示输入你的名词&#xff0c;点击Enter之后会出现你应该获得的奖学金金额。 结果演示 代码演示 package com.eight; import java.util.Scanner; public class Mingci {public static void main(Str…

android反射开启通知_Android中反射的简单应用

自己对反射的理解和应用还处于比较浅显的阶段&#xff0c;写这篇文章更多在于整理总结&#xff0c;也就是帮助自己进一步的理解和学习反射机制。反射反射的概念是由Smith在1982年首次提出的&#xff0c;主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。java中类反…

【OpenCV 例程200篇 目录-202205更新】

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【OpenCV 例程200篇 目录】 更新日期&#xff1a;2022-05-12 【youcans 的 OpenCV 例程200篇】01. 图像的读取&#xff08;cv2.im…

最大值平均值和排序

根据文本提示输入五个年龄&#xff0c;点击Enter之后程序会输出五个年龄中最大的年龄&#xff0c;平均年龄即年龄从小到大的排序分别是啥。 结果演示 代码演示 package com.nine; import java.util.Scanner; import java.util.Arrays; public class Shuzu {public static v…

【youcans 的 OpenCV 例程200篇】171.SLIC 超像素区域分割

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】171.SLIC 超像素区域分割 5. 区域分割之聚类方法 5.2 基于超像素的区域分割 超像素图像分割基于依赖于图像的颜色信息及空间关系信息&#xff0c;将图像分割为远超于目标个数、远小于像素数量的超像素块&…

判断三角形是否是直角三角形

根据文本提示分别输入第一第二第三条三角形的边长&#xff0c;程序会根据勾股定理计算是否是直角三角形&#xff0c;如果是直角三角形&#xff0c;会显示该三角形是直角三角形&#xff0c;如果不是直角三角形则显示该三角形不是直角三角形。 结果演示 代码演示 package com.…

【youcans 的 OpenCV 例程200篇】172.SLIC 超像素区域分割算法比较

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】172.SLIC 超像素区域分割算法比较 5. 区域分割之聚类方法 5.3 SLIC 超像素区域分割 SLIC 基于网格化 K-means 聚类方法&#xff0c;原理简单&#xff0c;计算复杂度为O(N)&#xff0c;N 为像素点个数。 S…

【youcans 的 OpenCV 例程200篇】173.SEEDS 超像素区域分割

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】173.SEEDS 超像素区域分割 5.4 SEEDS 超像素区域分割 超像素个体应在视觉上一致&#xff0c;特别是颜色应尽可能均匀。SLIC 使用欧几里德距离来度量像素点的相似度&#xff0c;不能反映颜色的方差。 SEED…

能否组成三角形

根据三角形三边长判断是否可以组成一个三角形&#xff0c;如果输入的不对会给出相应的提示。 结果演示 代码演示 package com.nine; import java.util.Scanner; public class ZhiJiao {public static void main(String[] args) {Scanner scan new Scanner(System.in);System…

【youcans 的 OpenCV 例程200篇】174.LSC 超像素区域分割

【OpenCV 例程200篇 总目录-202206更新】** 【youcans 的 OpenCV 例程200篇】174.LSC 超像素区域分割 5.5 LSC 超像素区域分割 线性谱聚类&#xff08;Linear Spectral Clustering&#xff0c;LSC&#xff09;是 SLIC 的改进方案&#xff0c;可以生成紧凑且均匀的超像素&…

修改SqlServer的登录密码

我们每次打开SqlServer数据库的时候首先会让我们登录用户名和密码&#xff0c;那么我们如何修改之前设定的密码呢&#xff1f; 1.打开我们的SqlServer 2.点击安全性&#xff0c;选择自己登录SqlServer的账户双击看到如下页面 3.在密码和确认密码的输入框中修改我们的新密码。…

java递归栈_java-66-用递归颠倒一个栈。例如输入栈{1,2,3,4,5},1在栈顶。颠倒之后的栈为{5,4,3,2,1},5处在栈顶...

import java.util.Stack;public class ReverseStackRecursive {/*** Q 66.颠倒栈。* 题目&#xff1a;用递归颠倒一个栈。例如输入栈{1,2,3,4,5}&#xff0c;1在栈顶。* 颠倒之后的栈为{5,4,3,2,1}&#xff0c;5处在栈顶。*1. Pop the top element*2. Reverse the remaining st…

Redis DeskTop Manager 使用教程

redis desktop manager windows 是一款能够跨平台使用的开源性redis可视化工具。 redis desktop manager主要针对redis开发设计&#xff0c;拥有直观强大的可视化界面&#xff0c;具有完善全面的数据操作功能&#xff0c;可以针对目标key执行rename&#xff0c;delete&#xf…

【youcans 的 OpenCV 例程200篇】175.超像素区域分割方法比较

【youcans 的 OpenCV 例程200篇】175.超像素区域分割方法比较 5.2 基于超像素的区域分割 超像素图像分割基于依赖于图像的颜色信息及空间关系信息&#xff0c;将图像分割为远超于目标个数、远小于像素数量的超像素块&#xff0c;达到尽可能保留图像中所有目标的边缘信息的目的…

【youcans 的 OpenCV 例程200篇】176.图像分割之均值漂移算法 Mean Shift

【youcans 的 OpenCV 例程200篇】176.图像分割之均值漂移算法 【youcans 的 OpenCV 例程200篇】177.图像分割之 GraphCuts 图割法 【youcans 的 OpenCV 例程200篇】178.图像分割之 GrabCut 图割法&#xff08;框选前景&#xff09; 【youcans 的 OpenCV 例程200篇】179.图像分割…

在线答题系统

使用Jquery制作了一个在线答题系统 功能分析 1.开始界面 2.结束界面 3.题目的内容和选项的选择 4.题目的切换 5.分数的计算 6.判断是否选中选项 效果演示 代码演示 一 . html代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht…

【youcans 的 OpenCV 例程200篇】177.图像分割之 GraphCuts 图割法

【youcans 的 OpenCV 例程200篇】176.图像分割之均值漂移算法 【youcans 的 OpenCV 例程200篇】177.图像分割之 GraphCuts 图割法 【youcans 的 OpenCV 例程200篇】178.图像分割之 GrabCut 图割法&#xff08;框选前景&#xff09; 【youcans 的 OpenCV 例程200篇】179.图像分割…

element 搜索匹配_分享一个element-ui级联选择器的搜索问题,顺便问下有没有解决方案。...

楼主做的是一个三级联动的城市筛选&#xff0c;后台给过来的数据并不全是按照label, value, children的key给到我&#xff0c;数据格式但是官方的props只能指到一级&#xff0c;具体指到2-3级我还不没弄明白。于是 &#xff0c; 需要自己转换:options"options"v-mode…

【youcans 的 OpenCV 例程200篇】178.图像分割之 GrabCut 图割法(框选前景)

【youcans 的 OpenCV 例程200篇】176.图像分割之均值漂移算法 【youcans 的 OpenCV 例程200篇】177.图像分割之 GraphCuts 图割法 【youcans 的 OpenCV 例程200篇】178.图像分割之 GrabCut 图割法&#xff08;框选前景&#xff09; 【youcans 的 OpenCV 例程200篇】179.图像分割…