关于ADO.NET连接池

前几天同事问我一个问题,一种CS架构的程序,直接把SQL Server作为服务端,每个客户端直接连接数据库操作,如果客户端打开的数量过多时SQL Server的连接数将会特别高,数据库端形成性能瓶颈,这种情况下怎么办?想了想,造成这种情况的原因是ADO.NET的内部机制造成的。ADO.NET中为了提高性能,所以使用了连接池,这样每个请求就不必都创建一个连接,然后认证,然后执行SQL,而是从连接池中直接取出连接执行SQL,执行完成后也并不是真正关闭连接,而是将该连接重新放回连接池中。如果有100个客户端,每个客户端在使用一段时间后连接池中保存了10个连接,那么在这种情况下,即使不在客户端做任何操作,SQL Server上都有1000个连接,这样不出性能问题才怪。

既然是连接池的问题,那么我就针对该问题想到了2个解决办法:

1.关闭ADO.NET的连接池,每次执行SQL时都是新建一个连接执行,然后关闭。这样做将使数据查询有所减慢(每次都建立连接,每次都认证,当然会慢了),不过这个慢是毫秒级的,一般感觉不到的,但是如果一个操作就涉及到几百个SQL语句的情况可能会明细感觉到减慢。修改方法特别简单,都不用修改代码,在数据库链接字符串中加入Pooling=False;即可。

2.修改架构,这种CS架构除了性能问题外还会出现其他的比如安全上的问题。可以将直接连数据库的方法改成连接服务,这其中可以使用Remoting、Web服务等,当然现在可以统一用WCF了。这样做就只有服务程序去连接数据库,而客户端只连接服务程序,这样就不会出现连接池造成的瓶颈。不过这样做代码修改量很大,若真要改还是很痛苦的。

以下是网上找到的一篇介绍ADO.NET连接池的文章,感觉不错。

连接池允许应用程序从连接池中获得一个连接并使用这个连接,而不需要为每一个连接请求重新建立一个连接。一旦一个新的连接被创建并且放置在连接池中,应用程序就可以重复使用这个连接而不必实施整个数据库连接创建过程。

当应用程序请求一个连接时,连接池为该应用程序分配一个连接而不是重新建立一个连接;当应用程序使用完连接后,该连接被归还给连接池而不是直接释放。

如何实现连接池

确保你每一次的连接使用相同的连接字符串(和连接池相同);只有连接字符串相同时连接池才会工作。如果连接字符串不相同,应用程序就不会使用连接池而是创建一个新的连接。

优点

使用连接池的最主要的优点是性能。创建一个新的数据库连接所耗费的时间主要取决于网络的速度以及应用程序和数据库服务器的(网络)距离,而且这个过程通常是一个很耗时的过程。而采用数据库连接池后,数据库连接请求可以直接通过连接池满足而不需要为该请求重新连接、认证到数据库服务器,这样就节省了时间。

缺点

数据库连接池中可能存在着多个没有被使用的连接一直连接着数据库(这意味着资源的浪费)。

技巧和提示

1. 当你需要数据库连接时才去创建连接池,而不是提前建立。一旦你使用完连接立即关闭它,不要等到垃圾收集器来处理它。

2. 在关闭数据库连接前确保关闭了所有用户定义的事务。

3. 不要关闭数据库中所有的连接,至少保证连接池中有一个连接可用。如果内存和其他资源是你必须首先考虑的问题,可以关闭所有的连接,然后在下一个请求到来时创建连接池。

连接池FAQ

1. 何时创建连接池?

当第一个连接请求到来时创建连接池;连接池的建立由数据库连接的连接字符创来决定。每一个连接池都与一个不同的连接字符串相关。当一个新的连接请求到来时如果连接字符串和连接池使用的字符串相同,就从连接池取出一个连接;如果不相同,就新建一个连接池。

2. 何时关闭连接池?

当连接池中的所有连接都已经关闭时关闭连接池。

3. 当连接池中的连接都已经用完,而有新的连接请求到来时会发生什么?

当连接池已经达到它的最大连接数目时,有新的连接请求到来时,新的连接请求将放置到连接队列中。当有连接释放给连接池时,连接池将新释放的连接分配给在队列中排队的连接请求。你可以调用close和dispose将连接归还给连接池。

4. 我应该如何允许连接池?

对于.NET应用程序而言,默认为允许连接池。(这意味着你可以不必为这件事情做任何的事情)当然,如果你可以在SQLConnection对象的连接字符串中加进Pooling=true;确保你的应用程序允许连接池的使用。

5. 我应该如何禁止连接池?

ADO.NET默认为允许数据库连接池,如果你希望禁止连接池,可以使用如下的方式:

1) 使用SQLConnection对象时,往连接字符串加入如下内容:Pooling=False;

2) 使用OLEDBConnection对象时,往连接字符串加入如下内容:OLE DB Services=-4;

时间: 2024-09-07 15:28:58

关于ADO.NET连接池的相关文章

ADO.NET连接池FAQ

ado 摘要 连接池允许应用程序从连接池中获得一个连接并使用这个连接,而不需要为每一个连接请求重新建立一个连接.一旦一个新的连接被创建并且放置在连接池中,应用程序就可以重复使用这个连接而不必实施整个数据库连接创建过程. 当应用程序请求一个连接时,连接池为该应用程序分配一个连接而不是重新建立一个连接:当应用程序使用完连接后,该连接被归还给连接池而不是直接释放. 如何实现连接池 确保你每一次的连接使用相同的连接字符串(和连接池相同):只有连接字符串相同时连接池才会工作.如果连接字符串不相同,应用程序

Ado.Net连接池的速度测试

晚上闲来无事,突然想测试一下Ado.Net连接池带来的连接速度提升,写了以下代码:    1using System; 2using System.Configuration; 3using System.Data.SqlClient; 4using System.Diagnostics; 5 6namespace ConsoleApplication1 7{ 8    class Program 9    {10        static void Main(string[] args)11

详解ADO.NET连接池

ADO.NET中提供了连接池的功能,多数开发人员很少设置它,因为它是默认的. 界面设置如下图: 关闭连接池也很简单,在连接字符串如下: Data Source=(local);Initial Catalog=AdventureWorks;Integrated Security=SSPI;Pooling=False; 但连接池的本质是什么样的呢? 用Reflector,打开System.Data.SqlClient.SqlConnection的ConnectionString属性的设置值的方法,如

一起谈.NET技术,详解ADO.NET连接池

ADO.NET中提供了连接池的功能,多数开发人员很少设置它,因为它是默认的. 界面设置如下图:   关闭连接池也很简单,在连接字符串如下: Data Source=(local);Initial Catalog=AdventureWorks;Integrated Security=SSPI;Pooling=False; 但连接池的本质是什么样的呢?   用Reflector,打开System.Data.SqlClient.SqlConnection的ConnectionString属性的设置值的

ADO.NET之连接池技术的使用详解_实用技巧

连接到数据库服务器通常需要一定的时间,且服务器也需要一定的资源来处理连接.Web应用程序有时处理成千上万的连接,需要相当多的资源来处理连接.ADO.NET具有连接池的特性,连接池的功能是保留一定数量的连接,当用户使用相同的连接字符串再次连接服务器时,ASO.NET将使用连接池中的连接而不用重新发起一次连接过程.当调用Close方法关闭连接时,ADO.NET将使用连接池中的连接而不用重新发起一次连接过程.当调用Close方法关闭连接时,连接将会返回到连接池中,下次再次调用Open方法时,将从连接池

简述SQL SERVER连接池的内部机制

当应用程序运行的时候,会有一个连接池的管理控件运行在应用程序的进程里,统一管理应用程序和SQLSERVER建立的所有连接, 并且维护这些连接一直处于活动状态.当有用户发出一个connection open指令时连接池会在自己维护的连接池中找一个处于空闲状态 的连接放回自己管理的连接池里,给这个用户使用.当用户使用完毕后,发出connection close指令,连接池会把这个连接放回自己 管理的连接池里,让他重新处于空闲状态,而不是真的从SQL里登出.这样如果下次有用户需要相同连接,就可以重用这

.net 中的SqlConnection连接池机制详解_实用技巧

正确的理解这个连接池机制,有助于我们编写高效的数据库应用程序. 很多人认为 SqlConnection 的连接是不耗时的,理由是循环执行 SqlConnection.Open 得到的平均时间几乎为0,但每次首次open 时,耗时又往往达到几个毫秒到几秒不等,这又是为什么呢? 首先我们看一下 MSDN 上的权威文档上是怎么说的 Connecting to a database server typically consists of several time-consuming steps. A

.net访问数据库连接超过连接池设置的上限

问题描述 我的WEB服务器的连接池设置的上限是60,下限是30.为什么会对oracle服务器的连接数达到200+,请问是什么可能的原因导致的? 解决方案 解决方案二:很简单,你丫写的程序不过关,很多连接你只开不关.....解决方案三:很简单,你丫写的程序不过关,很多连接你只开不关.....解决方案四:在sql连接语句中可以手动设置连接池的最大和最小数值ado.net自带功能好象和数据库没什么太大关系..解决方案五:很明显,和数据库没关系.你的程序问题!解决方案六:WEB服务器的连接池oracle

SqlConnection 的连接池机制解析

物理连接建立时,需要做和服务器握手,解析连接字符串,授权,约束的检查等等操作,而物理连接建立后,这些操作就不会去做了.这些操作是需要一定的时间的.所以很多人喜欢用一个静态对象存储 SqlConnection 来始终保持物理连接,但采用静态对象时,多线程访问会带来一些问题,实际上,我们完全不需要这么做,因为 SqlConnection 默认打开了连接池功能,当程序 执行  SqlConnection.Close 后,物理连接并不会被立即释放,所以这才出现当循环执行 Open操作时,执行时间几乎为0