-
Notifications
You must be signed in to change notification settings - Fork 8.6k
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
1.2.6版本中仍然存在同一个holder在connections出现两次的问题,高并发下会出现statement is closed等问题。 #4316
Comments
这里并发多大会发生,我这边用最新版本,并发在56个就频繁的出现。 |
导致这个问题的根本原因不是因为并发高,是某种特定场景下,连接池持有了两个相同的连接。在高并发下会相互影响。 |
@Linliangkung 请问你给的例子也是 keepAliveBetweenTimeMillis大于minEvictableIdleTimeMillis 依然也会有重复链接的问题。 为何说用这个配置可以暂时避免这个问题? |
写错了,是小于 |
@Linliangkung 感谢回复。 由于keepConnection放回connections未修改lastActiveTimeMills,会导致connections的空闲时间不是递减的。 例如[a,b,c,d] c和d是keep alive后放回的连接,那么c和d的lastActiveTimeMills大于a和b,下次还是有可能c和d放入keepaliveconnections,导致连接重复。不知道我理解的对不对。 |
+1 |
@Linliangkung 把keepAliveBetweenTimeMillis的配置设置小于minEvictableIdleTimeMillis就可以保证不会有重复连接吗? 你试过吗 |
可以,能保证 |
minEvictableIdleTimeMillis=180000 依然会出现 statement is close,不过我用的druid是 1.1.22版本,我升到1.2.6再看看 |
1.druid配置参数如下:
minEvictableIdleTimeMillis=100000
setMaxEvictableIdleTimeMillis=1000L * 60L * 60L * 7
keepAliveBetweenTimeMillis=120000
minIdle=2
timeBetweenEvictionRunsMillis=70000
validationQuery=select 1
keepAlive=true
2.测试代码如下:
3.运行结果:
4.原因分析:
问题出现在DestoryTask的shrink函数中。
时间点70000ms时:connections[connection2],connection2的空闲时间均小于minEvictableIdleTimeMillis和keepAliveBetweenTimeMillis跳过
时间点95000时,connection1返还连接池,此时connections[connection2,connection1],connections中的元素空闲时间是递减的
时间点140000ms时,connection2因为空闲时间大于120000会加到keepConnections数组中,后返还,返还时未修改lastActiveTimeMillis,此时connections[connection1,connection2],connection2的空闲时间比connection1的要大
时间点210000ms时,connections1因为空闲时间大于100000,但由于设置minidel=2会跳过shrink中所有if代码块,connections2由于空闲时间大于120000,会加入keepconnection中。进而导致connections会有两个相同的holder
5.总结:
1.2.6版本中限制timeBetweenEvictionRunsMillis小于keepAliveBetweenTimeMillis并不能解决问题。该问题出现的原因还是shrink函数中connections拷贝的bug,希望官方能解决这个bug,可参考pullrequest:#4218
另一方面keepConnection放回connections未修改lastActiveTimeMills,会导致connections的空闲时间不是递减的。
@wenshao
The text was updated successfully, but these errors were encountered: