ADO.NET连接池是通过内部机制组成的。为了提高它的性能,于是就用了ADO.NET连接池,这样每个请求就不必都创建一个连接,接下来认证,然后执行SQL,在通过连接字符串创建SqlConnection对象时,创建了连接池。其连接字符串的格式如下:
- Data Source=127.0.0.1;Initial Catalog=pub;
- Persist Security Info=True;User ID=sa;password=sa;
- Pooling=True;Min Pool Size=10;Max Pool Size=200;timeout=60
(1)默认情况下,连接字符串中Pooling属性为True。如果使用连接池,在创建连接对象时,应该使用同一个连接字符串。ADO.net允许创建多个连接池,并且每个池都与不同的连接字符串关联,打开新连接时,如果连接字符串并非与现有池完全匹配,将创建一个新池。如果 MinPoolSize 在连接字符串中未指定或指定为零,池中的连接将在一段时间不活动后关闭。但是,如果指定的 MinPoolSize 大于零,在 AppDomain 被卸载并且进程结束之前,连接池不会被破坏。非活动或空池的维护只需要最少的系统开销。
(2)添加连接
连接池是为每个唯一的连接字符串创建的。当创建一个池后,将创建多个连接对象并将其添加到该池中,以满足最小池大小的要求。连接根据需要添加到池中,但是不能超过指定的***池大小(默认值为 100)。连接在关闭或断开时释放回池中。连接池进程通过在连接释放回池中时重新分配连接,来满足这些连接请求。如果已达到***池大小且不存在可用的连接,则该请求将会排队。然后,池进程尝试重新建立任何连接,直到到达超时时间(默认值为 15 秒)。如果池进程在连接超时之前无法满足请求,将引发异常。#t#
(3)移除连接
如果连接长时间空闲,或池进程检测到与服务器的连接已断开,连接池进程会将该连接从池中移除。在使用完连接时一定要关闭连接,以便连接可以返回池。要关闭连接,可以使用 Connection 对象的 Close 或 Dispose 方法,也可以通过在 C# 的 using 语句中。
(4)清除池
ADO.NET 2.0 引入了两种新的方法来清除池:ClearAllPools 和 ClearPool。ClearAllPools 清除指定提供程序的连接池,ClearPool 清除与特定连接关联的ADO.NET连接池。
(5)事务支持
连接是根据事务上下文来从池中取出并进行分配的。除非在连接字符串中指定了 Enlist=false,否则ADO.NET连接池将确保连接在 Current 上下文中登记。如果连接使用登记的 System.Transactions 事务关闭并返回到池中,连接将保留在池中,以便使用相同 System.Transactions 事务对该连接池的下一次请求将返回相同的连接(如果可用)。如果发出这样的请求,而没有可用的池连接,则会从池的非事务性部分取出一个连接并登记。如果在池的每个区域都没有可用的连接,则会创建一个新的连接并登记。