首页
网页制作
网络编程
脚本专栏
数据库
网站运营
网络安全
平面设计
CMS教程
搜索
建站极客
网络编程
ASP.NET
正文
.NET 数据库连接池
所属分类:
网络编程
/
ASP.NET
阅读数: 1024
收藏 0
赞 0
分享
则您需要负责打开 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 异常。
现在您必须决定要采取的措施,我不建议您告诉用户您已经用完了所有连接。有些应用程序会通知用户系统正忙于帮助其他客户,并建议用户稍后进行访问。其他应用程序则播放一段动画,通知用户系统尚未死锁,而是正在忙于处理他们的请求。同时,您的代码重新尝试操作。在所有情况下,您应该记录这些故障,以便帮助诊断问题的症结所在,并记录您已经耗尽了资源。
更多精彩内容
其他人还在看
ASP.Net 之Datalist删除功能详解附代码
ASP.Net 之Datalist删除功能详解附代码,需要的朋友可以参考一下
评论 0
收藏 0
赞 0
分享
ASP.NET(C#)验证数字的两种方法
ASP.NET(C#)验证数字的两种方法,需要的朋友可以参考一下
评论 0
收藏 0
赞 0
分享
此页的状态信息无效,可能已损坏 的处理办法及原因分析
此页的状态信息无效,可能已损坏 的处理办法及原因分析,需要的朋友可以参考一下
评论 0
收藏 0
赞 0
分享
MultiLine 换行后实现读取不换行的具体思路
输入内容中有换行,保存到数据库,直接查看感觉没有换行,但查询结果“以文本格式显示结果”你就会发现 其实是有换行的,下面与大家分享下具体的解决方法
评论 0
收藏 0
赞 0
分享
swfupload ajax无刷新上传图片实例代码
在这里上传图片就需要用到ajax无刷新上传图片,这里面包含的东西不是一点半点。这里用到的是一个插件swfupload实现无刷新上传图片,感兴趣的朋友可以参考下哈
评论 0
收藏 0
赞 0
分享
静态gb2312编码在项目传值出现中文乱码现象
参考的美工静态页面是gb2312格式的,当此编码拿到项目中后,utf-8编码的系统,加载页面时,会出现样式问题,比如不能正常居中等
评论 0
收藏 0
赞 0
分享
System.Timers.Timer定时执行程序示例代码
如果是某个逻辑功能的定时,可以将code放到逻辑功能的类的静态构造函数中,在该逻辑类第一次执行时,静态构造函数会被调用,则定时自然启动
评论 0
收藏 0
赞 0
分享
分享下Asp.Net面试题目及答案集合
这篇文章主要是总结asp.net开发人员在面试过程中常遇到的一些问题小结,需要的朋友可以参考下
评论 0
收藏 0
赞 0
分享
给自定义Web控件添加事件(前后台代码)
给自定义控件(Web Control)添加事件具体前后台代码如下,感兴趣的朋友可以参考下哈
评论 0
收藏 0
赞 0
分享
ASP.NET过滤器的应用方法介绍
ASP.NET过滤器的应用方法介绍,需要的朋友可以参考一下
评论 0
收藏 0
赞 0
分享
查看更多
网络赚钱
更多
漂洋过海坑死你 海淘代购名为国际大牌实为国产的山寨货
网赚之谈:做什么网站才能让我们草根站长有个出路
怎么用互联网思维的做餐饮?
SEO赚钱之道:11种可以让你盈利的SEO实业方法
光大银行网上银行西联汇款收汇方法分享
冲刺双十一 如何做好淘宝双11期间的推广及运营
站长故事
更多
小米、华为互喷的背后:互相吃翔的GDP!
微营销实例之一个80后妈妈的微商之旅
一问易答:为何小米4/魅族MX4不支持NFC?
揭晓互联网三大巨头(百度,腾讯,阿里巴巴)和草根站长的往来
创业失败:一个屌丝站长4年互联网的辛酸经历
90后男子新婚杀妻后将照片发朋友圈续:被判死缓