不错呦!smile@林凯西,确保“准备文件”中的几个文件都有安装,S...您好,看了您这篇帖子觉得很有帮助。但是有个问题想请...我的修改过了怎么还被恶意注册呢 @jjjjiiii 用PJ快9年了,主要是A...PJ3啊,貌似很少有人用PJ了,现在不是WP就是z...@332347365,我当时接入时错误码没有-10...楼主,ChkValue值应为-103是什么意思呢?...大哥 你最近能看到我发的信息,请跟我联系,我有个制...
关于ADO.Net连接池(Connection Pool)的一些个人见解
编辑:dnawo 日期:2008-12-26
建立池连接可以显著提高应用程序的性能和可缩放性。SQL Server .NET Framework 数据提供程序自动为 ADO.NET 客户端应用程序提供连接池(MSDN)。
Opening a database connection is a resource intensive and time consuming operation. Connection pooling increases the performance of Web/windows applications by reusing active database connections instead of creating a new connection with every request. Connection pool manager maintains a pool of open database connections. When a new connection requests come in, the pool manager checks if the pool contains any unused connections and returns one if available. If all connections currently in the pool are busy and the maximum pool size has not been reached, the new connection is created and added to the pool. When the pool reaches its maximum size all new connection requests are being queued up until a connection in the pool becomes available or the connection attempt times out.
Connection pooling behavior is controlled by the connection string parameters. Please look into MSDN documents in the reference link if you want to know further information.
前面是关于连接池知识的一些基本介绍,下面的内容是重点,也是个人见解。因为没有这方面的文档资料参考或者佐证,所以请各位仔细思考和讨论(我不想误导大家)。
下面分2种情况进行讨论。
1. Client端的windows form application通过ADO.Net直接访问后台Database。

我认为在这种情况下,每一个Client端和Database之间都存在一个连接池。通过设置ConnectiongString的Max Pool Size和Min Pool Size属性来验证。
如Max Pool Size = 5, Min Pool Size = 3, 通过SQL Server的SP_WHO2可以检测导如下结果:
启动1个Client端的Windows form application:application和SQL Server之间存在3个connection。
启动2个Client端的Windows form application:application和SQL Server之间存在6个connection。
启动3个Client端的Windows form application:application和SQL Server之间存在9个connection。
由此可见,每一个Client端和SQL Server之间都存在一个连接池,否则9个connection已经超出了Max Pool Size的设定。
2. Client端的application不直接通过ADO.Net来访问后台Database,而是通过IIS Server来同后台Database Server打交道。
至少有如下2种情况:
(1)Client通过IE访问部署在IIS中的web application,web application中的Data Access Class进一步访问后台Database Server.
(2)Client端的windows form application访问部署在IIS中的Remote Object,Remote Object进一步访问后台Database Server.

下面进行同样的测试:通过设置ConnectiongString的Max Pool Size和Min Pool Size属性来验证。
如Max Pool Size = 5, Min Pool Size = 3, 通过SQL Server的SP_WHO2可以检测导如下结果:
启动1个Client端的Web form application:application和SQL Server之间存在3个connection。
启动2个Client端的Web form application:application和SQL Server之间存在3个connection。
启动3个Client端的Web form application:application和SQL Server之间存在3个connection。
调用由IIS承载的Remote Object,结果类似。只是在未启动Client端之前,发现在Remote Object与Database Server之间已经存在一个connection。
由此可见,对同一个application而言,IIS Server与Database Server之间只有存在一个连接池,与Client端的多少没有关系。
dnawo说明:确切的说应是IIS中每个站点与Database Server之间只有存在一个连接池!
3. 连接池小节
根据上面的测试结果,显然第二种情况更有利于减少无用的连接数量,提高Database Server的性能。关于.Net Remoting技术及其性能问题,可以参考如下的Reference连接,这里就不讨论了。
另外,本文是个人关于连接池的一些见解,如果观点有不正确之处,希望不要误导各位。欢迎各位在此发表意见。同意的说赞同,不同意的请提出您的看法。谢谢。
Reference Links:
(1) MSDN, ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconconnectionpoolingforsqlservernetdataprovider.htm
(2) Microsoft .NET Remoting:技术概述, http://www.microsoft.com/china/MSDN/library/NetFramework/default.mspx
(3) 性能比较:.NET Remoting 与 ASP.NET Web 服务, http://www.microsoft.com/china/msdn/archives/library/dnbda/html/bdadotnetarch14.asp
dnawo补充(以下均为测试结果):
1.在查询分析器中执行"exec sp_who"可查看连接数。
2.Min Pool Size的值表示连接池初始化时创建的连接数。
3.每次conn.open时并不一定创建新的连接,如果connection pool中有空闲连接,直接拿来就用。所以一定要养成conn.close的习惯。
4.当连接总数超过Max Pool Size的值时创建连接会出错,通常会提示:超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
5.IIS中回收应用程序池进行后可释放连接池中的所有连接。
Opening a database connection is a resource intensive and time consuming operation. Connection pooling increases the performance of Web/windows applications by reusing active database connections instead of creating a new connection with every request. Connection pool manager maintains a pool of open database connections. When a new connection requests come in, the pool manager checks if the pool contains any unused connections and returns one if available. If all connections currently in the pool are busy and the maximum pool size has not been reached, the new connection is created and added to the pool. When the pool reaches its maximum size all new connection requests are being queued up until a connection in the pool becomes available or the connection attempt times out.
Connection pooling behavior is controlled by the connection string parameters. Please look into MSDN documents in the reference link if you want to know further information.
前面是关于连接池知识的一些基本介绍,下面的内容是重点,也是个人见解。因为没有这方面的文档资料参考或者佐证,所以请各位仔细思考和讨论(我不想误导大家)。
下面分2种情况进行讨论。
1. Client端的windows form application通过ADO.Net直接访问后台Database。

我认为在这种情况下,每一个Client端和Database之间都存在一个连接池。通过设置ConnectiongString的Max Pool Size和Min Pool Size属性来验证。
如Max Pool Size = 5, Min Pool Size = 3, 通过SQL Server的SP_WHO2可以检测导如下结果:
启动1个Client端的Windows form application:application和SQL Server之间存在3个connection。
启动2个Client端的Windows form application:application和SQL Server之间存在6个connection。
启动3个Client端的Windows form application:application和SQL Server之间存在9个connection。
由此可见,每一个Client端和SQL Server之间都存在一个连接池,否则9个connection已经超出了Max Pool Size的设定。
2. Client端的application不直接通过ADO.Net来访问后台Database,而是通过IIS Server来同后台Database Server打交道。
至少有如下2种情况:
(1)Client通过IE访问部署在IIS中的web application,web application中的Data Access Class进一步访问后台Database Server.
(2)Client端的windows form application访问部署在IIS中的Remote Object,Remote Object进一步访问后台Database Server.

下面进行同样的测试:通过设置ConnectiongString的Max Pool Size和Min Pool Size属性来验证。
如Max Pool Size = 5, Min Pool Size = 3, 通过SQL Server的SP_WHO2可以检测导如下结果:
启动1个Client端的Web form application:application和SQL Server之间存在3个connection。
启动2个Client端的Web form application:application和SQL Server之间存在3个connection。
启动3个Client端的Web form application:application和SQL Server之间存在3个connection。
调用由IIS承载的Remote Object,结果类似。只是在未启动Client端之前,发现在Remote Object与Database Server之间已经存在一个connection。
由此可见,对同一个application而言,IIS Server与Database Server之间只有存在一个连接池,与Client端的多少没有关系。
dnawo说明:确切的说应是IIS中每个站点与Database Server之间只有存在一个连接池!
3. 连接池小节
根据上面的测试结果,显然第二种情况更有利于减少无用的连接数量,提高Database Server的性能。关于.Net Remoting技术及其性能问题,可以参考如下的Reference连接,这里就不讨论了。
另外,本文是个人关于连接池的一些见解,如果观点有不正确之处,希望不要误导各位。欢迎各位在此发表意见。同意的说赞同,不同意的请提出您的看法。谢谢。
Reference Links:
(1) MSDN, ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconconnectionpoolingforsqlservernetdataprovider.htm
(2) Microsoft .NET Remoting:技术概述, http://www.microsoft.com/china/MSDN/library/NetFramework/default.mspx
(3) 性能比较:.NET Remoting 与 ASP.NET Web 服务, http://www.microsoft.com/china/msdn/archives/library/dnbda/html/bdadotnetarch14.asp
dnawo补充(以下均为测试结果):
1.在查询分析器中执行"exec sp_who"可查看连接数。
2.Min Pool Size的值表示连接池初始化时创建的连接数。
3.每次conn.open时并不一定创建新的连接,如果connection pool中有空闲连接,直接拿来就用。所以一定要养成conn.close的习惯。
4.当连接总数超过Max Pool Size的值时创建连接会出错,通常会提示:超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
5.IIS中回收应用程序池进行后可释放连接池中的所有连接。
评论: 0 | 引用: 0 | 查看次数: 3951
发表评论
请登录后再发表评论!