使用连接池

1. 连接池

  1.1. 连接池的概念
  • 连接池是一个进程
  • 该进程保存连接并使其处于活动状态,使连接可以被重复使用。

  1.2. 如果没有连接池
  • 连接到数据源
     –建立物理通道(例如套接字或命名管道)
     – 与服务器进行初次握手
     –分析连接字符串信息
     – 由服务器对连接进行身份验证
     – 运行检查以便在当前事务中登记
     –…

  1.3. 连接池的作用
  • 通过数据库连接池,应用程序可以重用池中现有的连接,而不必反复与数据库建立新的连接。
  • 使用连接池可显著提高应用程序的可伸缩性,因为有限数量的数据库连接可以为数量大得多的客户端提供服务。
  • 同时,由于可以节省建立新连接所需的大量时间,使用连接池还能够改善性能。
  • 对于应用程序来说是透明的。

  1.4. 工作过程
  • Pooling 参数为 true 时(默认),连接池启用。
  • 两个连接的连接字符串相同时,被放置在一个连接池中。
  • 两个连接的连接字符串不同时,被放置在不同的连接池中。
  • 连接被 Close 时,连接被放置在连接池中以备重用。
  • 连接被 Dispose 时,连接被彻底删除。
  • 连接池最后一个连接被Close 时,连接池被删除。

  1.5. 控制 SQL Server 连接池
  • SQL Server 连接池有关的连接字符串变量
  • Connection Lifetime       连接生存期    默认值0
  • Connection Reset          连接重置        默认值True
  • Enlist              登记       默认值True
  • Max Pool Size          最大池大小    默认值100
  • Min Pool Size          最小池大小     默认值 0
  • Pooling            池         默认值True

  1.6. 控制OLE DB连接池
  • 默认连接池功能是激活的,在 OLE DB 连接中使用
  • 如要禁用OLE DB 连接池,在连接字符串
  中指定“OLE DB Services=-4” ,代码如下

Dim cnNorthwind As New OleDbConnection()
cnNorthwind.ConnectionString = _
"Provider=SQLOLEDB;" & _
"Data Source=London;" & _
"Integrated Security=SSPI;" & _
"OLE DB Services=-4;" & _
"Initial Catalog=Northwind;"

2. 使用连接池

 • 连接是通过连接字符串上的完全匹配算法进行池化的。
 • 池机制甚至对名称-值对之间的空格也敏感。

 2.1. 关闭连接
 . 使用完连接后,立即显示关闭连接。
 . 不要在类的Finalize方法中关闭连接。
  – 因为它在垃圾回收时才会执行
  –很有可能会造成连接池已满
 . DataAdapter前显式打开的连接不会自动关闭。

 2.2. 连接池的驻留
 • 如果 MinPoolSize 在连接字符串中未指定或指定为零,池中的连接将在一段时间不活动后关闭。
 • 如果指定的 MinPoolSize 大于零,在AppDomain 被卸载并且进程结束之前,连接池不会被破坏。
 • 非活动或空池的维护只需要最少的系统开销。

 2.3. 清除连接池
 • ClearAllPools
  –清除给定提供程序的连接池。
 • ClearPool
  –清除与特定连接关联的连接池。
  – 如果在调用时连接正在使用,将进行相应的标记。连接关闭时,将被丢弃,而不是返回池中。

 2.4. 池碎片
 • 池碎片是许多 Web 应用程序中的一个常见问题,应用程序可能会创建大量在进程退出后才会释放的池。这样,将打开大量的连接,
占用许多内存,从而影响性能。
  – 因为集成安全性产生的池碎片
  –因为许多数据库产生的池碎片

3. 使用事务

  3.1. 事务支持
  • 连接是根据事务上下文来从池中取出并进行分配的。
  – 除非在连接字符串中指定了Enlist=false,否则,连接池将确保连接在 Current 上下文中登记。
  – 当连接通过登记的System.Transactions 事务关闭并返回到池中时,连接将被保留,以便下次使用同一System.Transactions 
事务请求该连接池时,可返回同一连接(如果该连接可用)。
  – 如果该连接不可用,则会打开新连接。
  – 如果该事务没有可用连接,在该连接打开时,将自动注册该连接。
  • 当连接关闭时,它将被释放回池中,并根据其事务上下文放入相应的子部分。
  – 因此,即使分布式事务仍然挂起,仍可以关闭该连接而不会生成错误。
  – 这样,就可以在随后提交或中止分布式事务。

  3.2. 事务专有池
  • 连接池被划分为多个事务专有池和一个与当前尚未在事务中登记的连接对应的池。
  • 对于与特定事务上下文关联的线程,会返回相应池(该池包含在该事务中登记的连接)的连接。
  • 这使得使用已登记的连接成为一个透明的过程。

 3.3. 使用池对象管理连接池
  • 作为分布式开发人员,鼓励禁用 OLE DB 资源池和/或 ODBC 连接池,
并使用COM+ 对象池作为池化数据库连接的技术。
  • 这有两个主要原因:
  – 池大小和阈值可以明确的配置(在COM+ 目录中)。
  – 性能得到改善。池对象方法的性能比本机池高50%。
  • 如果您使用的是 OLE DB .NET 数据提供程序,您可能需要考虑使用COM+ 对象池,以便充分利用卓越的配置和改善的性能。
如果您为此目的开发池对象,则必须禁用OLE DB 资源池和自动事务登记(例如,通过在连接字符串中包含 "OLE DB Services=-4")。
您必须在自己的池对象实现中处理事务登记。
  • 对于SQL Server .NET 数据提供程序来说,它在内部使用池机制,所以您不再需要开发自己的对象池机制(在使用该提供程序时)。
因此,您可以避免执行与手动事务登记相关联的复杂任务。

4. 监视连接池

 • SQL Server 事件探查器
 • 性能监视器
 • 编程方式

posted @ 2017-08-30 21:24  tiger_yj  阅读(169)  评论(0编辑  收藏  举报