今天在客户现场测试部署的 ASP.NET 项目时,每次点击其中一个数据运算比较多的操作时,总是偶发性的提示 :
“/ASP.Web”应用程序中的服务器错误。
--------------------------------------------------------------------------------
超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.InvalidOperationException: 超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
后来尝试了几种办法,现整理如下:
第一 修改IIS 连接限制,(说明:我们的项目采用ViewState存储用户登录信息,JS存储其他全局信息,所以每次会自动下载匹配的ViewState文件以及JS脚本文件)
所以每次都采用自动下载的方式,每次下载都作为一次连接,每点击一次,IIS会作为一次新的连接请求。
修改连接限制方法如下:
选择高级设置——》
修改后的数据为: 其中 连接超时上限为:65535
另外可以自定义应用程序连接池:
一般情况下都会采用 集成 方式。
第二:修改 Web.Config
在数据库连接加 Max Pool Size = 512;server=local;uid=;pwd=;database=2004;Max Pool Size = 512;">一劳永逸。如果访问量很大,当然这是要以损失系统性能为代价的!
第三:如果有源码,首先需要查看所有数据库连接是否存在打开后没有关闭的操作。
DataReader是独占连接的,就是说你的程序可能设计上有问题。比如说最大连接设100,假设有100个人同时使用 DataReader正在读取数据库内容,那么当第101人读取的时候,连接池中的连接已经没有了,就会出现上面的错误。DataReader是独占连接 的,每个DataReader都要占用一个连接。当然这个情况是偶尔出现的,所以会很长时间出现一次,因为只有同时有超过连接池最大连接数量的并发操作才 会发生。而且你加大并发数量只能暂时缓解问题,如果你加大到200个并发连接,如果有201 人同时操作怎么办?你说了你使用Connection对象的Close()方法,这是不行的,因为Close()方法仅仅是关闭连接,但这个连接没有释 放,还是被这个对象占用,要释放必须使用Connection的Dispose()方法显式释放连接才可以,否则这个对象占用的连接只能等到垃圾收集的情 况下才能被释放。这种情况肯定会出现“超时时间已到”的错误。