使用连接池
王然
微软认证讲师
wangran@itgoldenbridge.com
点击添加MSN机器人小新
为您收听下载MSDN中文网络广播课程加油助力!
本次课程内容包括
? 连接池
? 使用连接池 ? 管理连接池 ? 使用事务 ? 监视连接池
收听本次课程需具备的条件
? 熟悉基本的 ADO.NET 连接 ? 熟悉 .NET 数据库应用开发
Level 300
连接池的概念
? 连接池是一个进程
? 该进程保存连接并使其处于活动状态,使
连接可以被重复使用
如果没有连接池
? 连接到数据源
- 建立物理通道(例如套接字或命名管道) - 与服务器进行初次握手
分析连接字符串信息
- 由服务器对连接进行身份验证 - 运行检查以便在当前事务中登记 - …
连接池的作用
? 通过数据库连接池,应用程序可以重用池
中现有的连接,而不必反复与数据库建立 新的连接。
? 使用连接池可显著提高应用程序的可伸缩
性,因为有限数量的数据库连接可以为数 量大得多的客户端提供服务。
? 同时,由于可以节省建立新连接所需的大
量时间,使用连接池还能够改善性能。 ? 对于应用程序来说是透明的
工作过程
? Pooling 参数为 true 时(默认),连接池启用 ? 两个连接的连接字符串相同时 ,被放置在一个连
接池中
? 两个连接的连接字符串不同时,被放置在不同的
连接池中
? 连接被 Close 时 , 连接被放置在连接池中以备重
用
? 连接被 Dispose 时, 连接被彻底删除
? 连接池最后一个连接被 Close 时,连接池被删除
控制 SQL Server 连接池
? SQL Server 连接池有关的连接字符串变量
? Connection Lifetime 连接生存期
默认值 0
? Connection Reset 连接重置
默认值 True
? Enlist
登记
默认值 True
? Max Pool Size
最大池大小 默认值 100
? Min Pool Size
最小池大小 默认值 0
? Pooling
池
默认值 True
控制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;"
使用连接池
? 连接是通过连接字符串上的完全匹配算法
进行池化的。
? 池机制甚至对名称-值对之间的空格也敏感。
关闭连接
? 使用完连接后,立即显示关闭连接 ? 不要在类的Finalize方法中关闭连接
- 因为它在垃圾回收时才会执行
- 很有可能会造成连接池已满
? DataAdapter前显式打开的连接不会自动关
闭
连接池的驻留
? 如果 MinPoolSize 在连接字符串中未指定
或指定为零,池中的连接将在一段时间不 活动后关闭。
? 如果指定的 MinPoolSize 大于零 , 在
AppDomain 被卸载并且进程结束之前,连 接池不会被破坏。
? 非活动或空池的维护只需要最少的系统开
销。
清除连接池
? ClearAllPools
- 清除给定提供程序的连接池。
? ClearPool
- 清除与特定连接关联的连接池。
- 如果在调用时连接正在使用,将进行相应的标 记。连接关闭时,将被丢弃,而不是返回池中。
池碎片
? 池碎片是许多 Web 应用程序中的一个常见
问题,应用程序可能会创建大量在进程退 出后才会释放的池。这样,将打开大量的 连接,占用许多内存,从而影响性能。
- 因为集成安全性产生的池碎片
- 因为许多数据库产生的池碎片
事务支持
? 连接是根据事务上下文来从池中取出并进行分配的。
- 除非在连接字符串中指定了 Enlist=false,否则,连接池将确保连
接在 Current 上下文中登记。
- 当连接通过登记的 System.Transactions 事务关闭并返回到池中
时,连接将被保留,以便下次使用同一 System.Transactions 事 务请求该连接池时,可返回同一连接(如果该连接可用)。
- 如果该连接不可用,则会打开新连接。
- 如果该事务没有可用连接,在该连接打开时,将自动注册该连接。
? 当连接关闭时,它将被释放回池中,并根据其事务上下文
放入相应的子部分。
- 因此,即使分布式事务仍然挂起,仍可以关闭该连接而不会生成
错误。
- 这样,就可以在随后提交或中止分布式事务。
事务专有池
? 连接池被划分为多个事务专有池和一个与 当前尚未在事务中登记的连接对应的池。 ? 对于与特定事务上下文关联的线程,会返 回相应池(该池包含在该事务中登记的连 接)的连接。
? 这使得使用已登记的连接成为一个透明的
过程。
使用池对象管理连接池
? 作为分布式开发人员,鼓励禁用 OLE DB 资源池和/或 ODBC 连接池,
并使用 COM+ 对象池作为池化数据库连接的技术。
? 这有两个主要原因:
- 池大小和阈值可以明确的配置(在 COM+ 目录中)。 - 性能得到改善。池对象方法的性能比本机池高 50%。
? 如果您使用的是 OLE DB .NET 数据提供程序 , 您可能需要考虑使用
COM+ 对象池,以便充分利用卓越的配置和改善的性能。如果您为此 目的开发池对象,则必须禁用 OLE DB 资源池和自动事务登记(例如, 通过在连接字符串中包含 "OLE DB Services=-4")。您必须在自己的 池对象实现中处理事务登记。
? 对于SQL Server .NET 数据提供程序来说,它在内部使用池机制,所
以您不再需要开发自己的对象池机制(在使用该提供程序时)。因此, 您可以避免执行与手动事务登记相关联的复杂任务。
监控连接池
? SQL Server 事件探查器 ? 性能监视器
? 编程方式
回顾
? 连接池
? 使用连接池 ? 管理连接池 ? 使用事务 ? 监视连接池
获取更多MSDN资源
? MSDN中文网站
http://msdn2.microsoft.com/zh‐cn ? MSDN中文网络广播
http:// www.microsoft.com/china/msdn/webcast ? MSDN中文网络广播课程预告邮件
http://www.microsoft.com/china/msdn/WebcastNewsletter/ ? MSDN免费中文速递邮件 (MSDN Flash)
http://msdn2.microsoft.com/zh‐cn/flash ? MSDN开发中心
http://msdn2.microsoft.com/zh‐cn/developercenters
? MSDN图书中心
http://www.microsoft.com/china/msdn/book
Question & Answer
如需提出问题,请在此区域输入文字,并单击 “问题和解答”右上方的“提问”按钮即可。
您也可以选择在微软中文技术论坛上寻求帮助,MSDN中文网络 广播的讲师们会定期在论坛上为大家解答与课程相关的技术问题。
http://forums.microsoft.com/china
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步