asp.net链接数据库超时的解决办法

错误提示:“超时时间已到。超时时间已到,可是还没有从池中获取链接。出现这种状况多是由于全部池链接均在使用,而且达到了最大池大小。  ”html

通过几天辛苦写的代码,终于实现了功能丰富的查询功能,可是使用的过程当中,却常常出现上面的错误,百思不得其解。写代码的时候就担忧由于功能复杂,效率会很低。数据库

解决方案一缓存

我想缘由多是并发操做。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接口,强迫释放资源,这样就不会出现链接数量不够的问题了。ui

解决方案二spa

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

解决方案三设计

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

 

:error connecting: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reachedserver

超时时间已到。超时时间已到,可是还没有从池中获取链接。出现这种状况多是由于全部池链接均在使用,而且达到了最大池大小。

问题描述:咱们获取链接超过链接池最大值时产生如上异常。一般链接池最大值为100。当咱们获取链接超过最大值时,ADO.NET等待链接池返回链接而超时,这样将抛出如上异常

产生这样的问题: 链接数大于 N  而且超出设置的时间(全部链接池中的链接都在用,而且等待的时间超时)
解决办法:1首先要作的是在咱们使用链接后当即关闭链接 

2 其次咱们能够经过链接字符串中的Max Pool Size = N;来动态扩大链接池中的链接最大数量。

3 更改链接时间 connect timeout=N

首先要保证全部的 connection 链接以后 都要手动的关闭, 特别是DataReader(

一个connection对象只能打开一个DataReader对象,在该datareader对象关闭以前,没法打开其余的datareader对象,知道该datareader 对象调用close 方法为止)
更改 链接数量和链接时间 根据实际状况而定
为何会出现这样的问题呢?
就是好比买票同样,五个窗口同时建立,每一个人都有本身的等待时间.假如五个建立,占用一个.还有四个空闲. 占用五个.剩下的人须要等待.可是 可能等待的时间很长.这些人都会不耐烦(超出规定时间)的走了.出现异常
 

正规的解释

- Connection Pool 如何工做的?(摘抄自(http://www.cnblogs.com/qqflying/archive/2012/02/13/2349583.html))

首 先当一个程序执行Connection.open()时候,ADO.net就须要判断,此链接是否支持Connection Pool (Pooling 默认为True),若是指定为False, ADO.net就与数据库之间建立一个链接(为了不混淆,全部数据库中的链接,都使用”链接”描述),而后返回给程序。

若是指定为 True,ADO.net就会根据ConnectString建立一个Connection Pool,而后向Connection Pool中填充Connection(全部.net程序中的链接,都使用”Connection”描述)。填充多少个Connection由Min Pool Size (默认为0)属性来决定。例如若是指定为5,则ADO.net会一次与SQL数据库之间打开5个链接,而后将4个Connection,保存在 Connection Pool中,1个Connection返回给程序。

当程序执行到Connection.close() 的时候。若是Pooling 为True,ADO.net 就把当前的Connection放到Connection Pool而且保持与数据库之间的链接。

同 时还会判断Connection Lifetime(默认为0)属性,0表明无限大,若是Connection存在的时间超过了Connection LifeTime,ADO.net就会关闭的Connection同时断开与数据库的链接,而不是从新保存到Connection Pool中。

(这个设置主要用于群集的SQL 数据库中,达到负载平衡的目的)。若是Pooling指定为False,则直接断开与数据库之间的链接。

而后当下一次Connection.Open() 执行的时候,ADO.Net就会判断新的ConnectionString与以前保存在Connection Pool中的Connection的connectionString是否一致。

(ADO.Net 会将ConnectionString转成二进制流,所 以也就是说,新的ConnectionString与保存在Connection Pool中的Connection的ConnectionString必须彻底一致,即便多加了一个空格,或是修改了Connection String中某些属性的次序都会让ADO.Net认为这是一个新的链接,而重新建立一个新的链接。因此若是您使用的UserID,Password的认 证方式,修改了Password也会致使一个Connection,若是使用的是SQL的集成认证,就须要保存两个链接使用的是同一个)。

然 后 ADO.net须要判断当前的Connection Pool中是否有可使用的Connection(没有被其余程序所占用),若是没有的话,ADO.net就须要判断ConnectionString设 置的Max Pool Size (默认为100),若是Connection Pool中的全部Connection没有达到Max Pool Size,ADO.net则会再次链接数据库,建立一个链接,而后将Connection返回给程序。

若是已经达到了 MaxPoolSize,ADO.net就不会再次建立任何新的链接,而是等待Connection Pool中被其余程序所占用的Connection释放,这个等待时间受SqlConnection.ConnectionTimeout(默认是15 秒)限制,也就是说若是时间超过了15秒,SqlConnection就会抛出超时错误(因此有时候若是SqlConnection.open()方法抛 出超时错误,一个可能的缘由就是没有及时将以前的Connnection关闭,同时Connection Pool数量达到了MaxPoolSize。)

相关文章
相关标签/搜索