超时时间已到,但是尚未从池中获取连接

来源:互联网 发布:网吧座位分布图软件 编辑:程序博客网 时间:2024/06/05 03:21

超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.InvalidOperationException: 超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。

这是个老问题了!你就查两点: 
  一、看所有open的连接是否都close了。 
  二、如果访问量很大,加上Max   Pool   Size=512这一句,当然这是要以损失系统性能为代价的! 
  这样以后一定可以解决你的问题!

  解决方案一

我 想原因可能是并发操作。DataReader是独占连接的,就是说你的程序可能设计上有问题。比如说最大连接设100,假设有100个人同时使用 DataReader正在读取数据库内容,那么当第101人读取的时候,连接池中的连接已经没有了,就会出现上面的错误。DataReader是独占连接 的,每个DataReader都要占用一个连接。当然这个情况是偶尔出现的,所以会很长时间出现一次,因为只有同时有超过连接池最大连接数量的并发操作才 会发生。而且你加大并发数量只能暂时缓解问题,如果你加大到200个并发连接,如果有201 人同时操作怎么办?你说了你使用Connection对象的Close()方法,这是不行的,因为Close()方法仅仅是关闭连接,但这个连接没有释 放,还是被这个对象占用,要释放必须使用Connection的Dispose()方法显式释放连接才可以,否则这个对象占用的连接只能等到垃圾收集的情 况下才能被释放。这种情况肯定会出现“超时时间已到”的错误。

解决方法:
         1 修改几个关键页面或访问比较频繁的数据库访问操作,使用DataAdapter和DataSet来获取数据库数据,不要使用DataReader。
         2 在访问数据库的页面上使用数据缓存,如果页面的数据不是经常更新(几分钟更新一次)的话,使用Cache对象可以不用访问数据库而使用缓存中的内容,那么可以大大减少连接数量。
         3 修改代码,把使用Connection对象的地方都在Close()后面加上Dispose()调用。
         4 建议对数据库操作进行大的修改,建立自己的数据库操作代理类,继承System.IDisposable接口,强迫释放资源,这样就不会出现连接数量不够的问题了。

解决方案二

解决方法(*):WEB.config 里面:在数据库连接加 Max Pool Size = 512;server=local;uid=;pwd=;database=2004;Max Pool Size = 512;">一劳永逸。

解决方案三

估计是连接(Connection)对象没有Close。倒是不必Dispose,而DataReader用完后应该关闭,但不关闭也没问题,只是不关闭的话此连接对象就一直不能用,只要你最终关闭了连接对象就不会出问题。  
   
   连接对象在Open后的操作都放在try块中,后面跟一个finally块:conn.Close();

 

其他答案:

 

ASP.NET c#在使用SqlDataReader读取数据的时候,出现这个提示,在网上找了一些回答也没有解决问题,最终还是看微软的PetShop找到了答案。
我在一个循环中使用了SqlDataReader:
        using (SqlDataReader reader = SqlHelper.ExecuteReader("select * from region where fatherid=0"))
        {
            while (reader.Read())
            {
                // 把省一级的区划存储到一个 Dictionary 中备用
                Province.Add(reader["name"].ToString(), int.Parse(reader["id"].ToString()));
            }
        }
虽然是在 using 语句中声明的 SqlDataReader,但程序运行几次之后还是出现了标题给出的的那个错误。在Sql Server 2005的 Manage Studio 中检查进程信息时,发现只要程序运行一次,就会出现几十个数据库的连接没有关闭(运行一次应该是读取了30多个省份的信息)。运行两三次后程序就崩溃了,进程信息达到120多个的时候就崩溃了。
于是就很奇怪,该关闭的Connection也都关闭了,Connection 和 SqlDataReader都是在using语句中声明的,怎么会连接不关闭呢?
对比了我写的SqlHelper类和PetShop中的SqlHelper类中的ExecuteReader方法后发现,他的ExecuteReader方法中的cmd.ExecuteReader()调用了一个参数:CommandBehavior.CloseConnection。
如下:cmd.ExecuteReader(CommandBehavior.CloseConnection)
这个参数MSDN中的解释是:在执行该命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭。
也就是说,如果只在using语句中声明SqlDataReader是严密的,那样只是在程序结束后关闭了SqlDataReader,而和他关联的Connection并没有关闭(或者说释放),因此,对于这种有关联对象打开的情况,还必须明确的把关联的对象也关闭,也就是CommandBehavior.CloseConnection参数提供的功能。
使用了这个参数后,运行多次该程序也没有出现问题,进程信息中的连接数也总是保持在20多个,其中大概20个都是系统的连接。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lee576/archive/2008/02/24/2116360.aspx

原创粉丝点击