热门标签 | 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 异常。
现在您必须决定要采取的措施,我不建议您告诉用户您已经用完了所有连接。有些应用程序会通知用户系统正忙于帮助其他客户,并建议用户稍后进行访问。其他应用程序则播放一段动画,通知用户系统尚未死锁,而是正在忙于处理他们的请求。同时,您的代码重新尝试操作。在所有情况下,您应该记录这些故障,以便帮助诊断问题的症结所在,并记录您已经耗尽了资源。
推荐阅读
  • 本文详细介绍了Oracle RMAN中的增量备份机制,重点解析了差异增量和累积增量备份的概念及其在不同Oracle版本中的实现。通过对比两种备份方式的特点,帮助读者选择合适的备份策略。 ... [详细]
  • 本文介绍了基于Java的在线办公工作流系统的毕业设计方案,涵盖了MyBatis框架的应用、源代码分析、调试与部署流程、数据库设计以及相关论文撰写指导。 ... [详细]
  • 深入解析 RuntimeClass 及多容器运行时应用
    本文旨在探讨RuntimeClass的起源、功能及其在多容器运行时环境中的实际应用。通过详细的案例分析,帮助读者理解如何在Kubernetes集群中高效管理不同类型的容器运行时。 ... [详细]
  • 利用Git GUI将本地项目同步至GitHub的方法
    GitHub作为开发者不可或缺的工具,不仅提供了丰富的开源项目资源,还极大地便利了个人项目的管理和版本控制。本文将详细介绍如何使用Git GUI工具将本地开发的项目上传至GitHub。 ... [详细]
  • 本文详细介绍了Objective-C中的面向对象编程概念,重点探讨了类的定义、方法的实现、对象的创建与销毁等内容,旨在帮助开发者更好地理解和应用Objective-C的面向对象特性。 ... [详细]
  • 第1章选择流程控制语句1.1顺序结构的基本使用1.1.1顺序结构概述是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行 ... [详细]
  • 最新进展:作为最接近官方声明的信息源,本文吸引了大量关注。若需获取最新动态,请访问:lkhill.com/ccie-version-5-update ... [详细]
  • APP及其接口测试全面解析
    本文深入探讨了移动应用(APP)及其接口测试的关键点,包括安装与卸载、功能一致性、系统兼容性、权限管理等多个方面的测试策略,以及针对接口的功能、边界值、参数组合等专业测试方法。同时,介绍了几款常用的测试工具,帮助开发者提高测试效率和质量。 ... [详细]
  • 最近与未婚妻讨论婚礼事宜时遇到了一些传统习俗的问题。比如,她提到接亲时不能走回头路,这让我感到非常困惑和不满。这种规定不仅增加了行程的复杂性,还可能影响婚礼当天的时间安排。 ... [详细]
  • 利用Cookie实现用户登录状态的持久化
    本文探讨了如何使用Cookie技术在Web应用中实现用户登录状态的持久化,包括Cookie的基本概念、优势及主要操作方法,并通过一个简单的Java Web项目示例展示了具体实现过程。 ... [详细]
  • 深入解析Java并发之ArrayBlockingQueue
    本文详细探讨了ArrayBlockingQueue,这是一种基于数组实现的阻塞队列。ArrayBlockingQueue在初始化时需要指定容量,因此它是一个有界的阻塞队列。文章不仅介绍了其基本概念和数据结构,还深入分析了其源码实现,包括各种入队、出队、获取元素和删除元素的方法。 ... [详细]
  • 本文详细介绍了跨站脚本攻击(XSS)的基本概念、工作原理,并通过实际案例演示如何构建XSS漏洞的测试环境,以及探讨了XSS攻击的不同形式和防御策略。 ... [详细]
  • 雨林木风 GHOST XP SP3 经典珍藏版 YN2014.04
    雨林木风 GHOST XP SP3 经典珍藏版 YN2014.04 ... [详细]
  • Python Selenium WebDriver 浏览器驱动详解与实践
    本文详细介绍了如何使用Python结合Selenium和unittest构建自动化测试框架,重点解析了WebDriver浏览器驱动的配置与使用方法,涵盖Chrome、Firefox、IE/Edge等主流浏览器。 ... [详细]
  • 本文档旨在提供C语言的基础知识概述,涵盖常量、变量、数据类型、控制结构及函数定义等内容。特别强调了常量的不同类型及其在程序中的应用,以及如何正确声明和使用函数。 ... [详细]
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社区 版权所有