关于连接池达到最大连接数的一个问题

今天同事遇到一个问题,在通过asp.net页面访问若干次sql server数据库之后,会产生“不能提供更多的连接的,连接池错误...”类似错误提示,为搞定这个bug,我们研究了一下。

首先,是查找直接原因。我了解了一下,这个项目底层使用的是sqlhelper,这一层应该不会有不释放连接的问题。初步猜测是在上层使用datareader的时候,并没有及时关闭,导致每次访问都会创建一个新的连接,使得连接池装满,而且每个连接都没有释放,所以最后再无资源创建连接了。

下面想方法证实这个猜测。先模拟操作,反复访问一个可能有问题的页面大约1分钟左右,那个熟悉的错误终于又出现了,OK,下面根据这个查错。打开SQL 企业管理器,找到管理-->当前系统信息项,重起IIS服务,刷新SQL管理器系统信息---没有程序创建的连接存在,再到aspx页面,访问若干次,转到SQL进程信息,果然!多了40多个连接,都为sleeping状态。再访问多次页面,又多了许多连接。。。看来正是这样,连接池中的连接好像是没有得到释放,所以其他需要使用连接的过程必须再创建新的连接实现,因此,连接池爆满,sql server也不再提供连接了.

问题似乎找到了,下一步开始查找程序中是否有没释放连接的地方.

继续...

下面有两种解决方案,一个是检查所有上层程序,查看使用datareader的地方是否关闭,另一个是编写回收连接的类,解决反复创建连接的问题。我建议使用第一种方法,但是由于系统比较复杂,架构并不是太合理,检查起来比较困难,在纠正了几处明显错误后,还是没有根本解决问题,加上release时间要求,就采用了第2个方案.

刚问了一下同事Marvel ,这个方法果然不错,如下:

AbstractDispose.cs

using System;

namespace XXXXXX
{
 /// <summary>
 /// Summary description for AbstractDispose.
 /// </summary>
 public abstract class AbstractDispose : IDisposable 
 {
  public AbstractDispose()
  {
   //
   // TODO: Add constructor logic here
   //

  }

  public void Dispose()
  {
   GC.Collect();
   //GC.SuppressFinalize(this);
  }

  
 }
}

其他底层类均继承此类即可!

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页