博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解决报错“超时时间已到。超时时间已到,但是尚未从池中获取连接”的方案...
阅读量:6716 次
发布时间:2019-06-25

本文共 1020 字,大约阅读时间需要 3 分钟。

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

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

 

解决方法1:

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

 

解决方法2:

改变连接池的大小.在连接字符串的后面加上以下代码:

Enlist=true;Pooling=true;Max Pool Size=300;Min Pool Size=0;Connection Lifetime=300;user id=sa;packet size=1000

packet size参数取512到32767中的任一整数值

转载于:https://www.cnblogs.com/feiyuhuo/p/5402582.html

你可能感兴趣的文章
翻译连载 | 第 10 章:异步的函数式(上)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇...
查看>>
Android webview 与 js(Vue) 交互
查看>>
UML统一建模语言
查看>>
给迷茫的JAVA员一些中肯建议, 你还在虚度光阴吗?
查看>>
计算机程序的思维逻辑 (40) - 剖析HashMap
查看>>
【腾讯 TMQ】从 0 到 1:打造移动端 H5 性能测试平台
查看>>
我是HDRoot!
查看>>
Postgres On Docker-窥探容器服务
查看>>
性能优化工具知识梳理(2) Systrace
查看>>
JS中的洋葱模型
查看>>
js call、apply、bind的实现
查看>>
《程序员的职业素养之代码整洁之道》成为专业人士必读
查看>>
使用IntelliJ Idea新建SpringBoot项目
查看>>
聊聊flink的Table API及SQL Programs
查看>>
Android M 封装过的运行时权限处理
查看>>
架构的演进,阿里资深Java工程师表述架构的腐化之谜
查看>>
DDGScreenShot —iOS 图片处理--多图片拼接 (swift)
查看>>
flutter 带未读消息的底部导航
查看>>
Protobuf 语言指南(proto3)
查看>>
你的目标,不要只是说说而已
查看>>