热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

.NET数据库连接池

如果您通过使用另一个Execute方法(例如,ExecuteScalar、ExecuteNonQuery和ExecuteXMLReader)执行查询
则您需要负责打开 SqlConnection 对象,而且,更重要的是,在查询结束时关闭该对象。如果您忘记了进行关闭,孤立连接会迅速地积累起来。
监视连接数
为了对孤立连接和发生溢出的连接池进行测试,我编写了一个 Web 窗体的示例应用程序。此应用程序使用的方法与您通常用于从查询返回数据的方法相同。(您可以在 http://www.sqlmag.com 上下载此代码的 WinForms 版本。)
我使用了清单 1 中的代码来打开和关闭到 Web 窗体应用程序的连接。标注 A 中的例程针对 110 个新的 SqlConnection 对象创建、打开和执行查询 — 比默认的池大小多 10 个连接。您必须在离开该例程之前关闭和放弃所有这些连接。如果不这样做,SqlConnection 对象将连同关联的池连接一起被孤立。ADO.NET 池机制 (aka the pooler) 关闭数据库连接,但不关闭池连接。我将连接池大小设置为 10,以便使该程序更快地失败 — 如果该程序会失败的话。通常,10 个连接对于一个运行速度象这个查询一样快的查询来说已经足够了。许多开发人员运行着忙碌的 Web 站点,这些 Web 站点使用不到五个连接来处理每天的几十万次点击。
标注 A 中的例程创建 SqlConnection 对象和 SqlCommand 对象,设置 CommandText,并打开连接。然后,标注 B 中的代码确定执行 DataReader 时是否使用 CommandBehavior.CloseConnection,这取决于用户在 Web 窗体上选择了哪些 CheckBox 控件。
在标注 C 的代码中,我指定是否将 DataReader 行集绑定到 DataGrid,或者是否在整个行集中进行循环。标注 C 的代码测试当您到达通过 DataReader 从数据提供程序传递回来的行集的末尾时会发生什么事情。
现在,我使用标注 D 中的代码来指定是手工关闭连接还是让某个其他操作(例如,数据绑定)来完成这项工作。坦白地说,以手工方式关闭连接通常是最安全的,因此,您可以肯定连接不会被孤立。
如果代码成功地运行到这一步,说明我已经成功地打开和关闭了 110 个连接。不过,如果出了问题,标注 E 的代码中的异常处理程序会将异常(通常是 Timeout)作为 InvalidOperationException 捕获,该异常是连接池已满时 ADO.NET 的响应方式。
表 1 汇总了各个选项使例程成功运行或失败的方式。请注意,如果您不设置 CommandBehavior.CloseConnection 选项,您的操作最终会失败 — 即使在使用绑定控件的情况下也是如此。即使您使用该选项,但如果您没有使用复杂的绑定控件,或者没有手工关闭 SqlDataAdapter 或 SqlConnection,该进程仍然会失败。
当我结束了这些示例应用程序的运行后,我已经生成了 1000 多个以上的池连接 — 所有连接均处于孤立状态。虽然“SQL Server 用户连接”计数为 0,但留下大约 40 个连接池。在我重新引导系统之前,孤立的池不会消失。
我用于此测试的示例应用程序包括使用 DataAdapter 来返回行的例程。除非您手工管理连接,否则,DataAdapter 将正确地打开和关闭 SqlConnection 对象,因此,您不太可能遇到孤立的池连接。不过,如果您的应用程序同时使用 DataReader 和 DataAdapter,您可能会发现,如果某个连接与一个未关闭的 DataReader 相关联,则 DataAdapter 无法针对该连接运行查询。
确定连接池何时达到最大连接数
正如我在 "Swimming in the .NET Connection Pool" 一文中讨论的那样,当连接池达到您通过 "Max Pool Size ConnectionString" 选项指定的最大连接数时,ADO.NET 将阻止任何随后打开额外连接的尝试。如果某个连接在您在 "ConnectionTimeout 选项中指定的时间之前变为可用,。NET 数据提供程序将向您的应用程序传递一个指向该连接的指针,以便将控件返回给应用程序。不过,如果没有及时释放任何连接,连接请求将引发 InvalidOperationException 异常。
现在您必须决定要采取的措施,我不建议您告诉用户您已经用完了所有连接。有些应用程序会通知用户系统正忙于帮助其他客户,并建议用户稍后进行访问。其他应用程序则播放一段动画,通知用户系统尚未死锁,而是正在忙于处理他们的请求。同时,您的代码重新尝试操作。在所有情况下,您应该记录这些故障,以便帮助诊断问题的症结所在,并记录您已经耗尽了资源。
推荐阅读
  • 本文详细介绍了IBM DB2数据库在大型应用系统中的应用,强调其卓越的可扩展性和多环境支持能力。文章深入分析了DB2在数据利用性、完整性、安全性和恢复性方面的优势,并提供了优化建议以提升其在不同规模应用程序中的表现。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 使用C#开发SQL Server存储过程的指南
    本文介绍如何利用C#在SQL Server中创建存储过程,涵盖背景、步骤和应用场景,旨在帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 优化版Windows 10 LTSC 21H2企业版:适用于低内存设备
    此版本为经过优化的Windows 10 LTSC 21H2企业版,特别适合低内存配置的计算机。它基于官方版本进行了精简和性能优化,确保在资源有限的情况下依然能够稳定运行。 ... [详细]
  • 当iOS设备越狱后,某些插件可能会导致系统崩溃(白苹果)。此时,可以通过进入安全模式来排查并删除有问题的插件。本文将详细介绍如何通过特定按键组合进入不加载MobileSubstrate的安全模式,并提供相关背景知识。 ... [详细]
  • 新冠肺炎疫情期间,各大银行积极利用手机银行平台,满足客户在金融与生活多方面的需求。线上服务不仅激活了防疫相关的民生场景,还推动了银行通过互联网思维进行获客、引流与经营。本文探讨了银行在找房、买菜、打卡、教育等领域的创新举措。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • 本文探讨了如何在发布 XenApp 应用时,通过命令行参数实现启动时的参数传递。特别介绍了静态和动态参数传递的方法,并详细解释了 ICA 文件中两种参数传递方式的区别及安全检查机制。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 尽管某些细分市场如WAN优化表现不佳,但全球运营商路由器和交换机市场持续增长。根据最新研究,该市场预计在2023年达到202亿美元的规模。 ... [详细]
author-avatar
joechl
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有