Open saikonwu opened 2 years ago
时间过长,连接被回收了
时间过长,连接被回收了 可是连接被回收之后,为何其他线程获取到该连接是不可用的;连接回收了应该保证其是正常连接
应该是shrink不应该采用System.arrayCopy前移方式清理connections数组的问题,可以看看 https://github.com/alibaba/druid/issues/4692
我也有出现,怎么解决呢,#5920
时间过长,连接被回收了 可是连接被回收之后,为何其他线程获取到该连接是不可用的;连接回收了应该保证其是正常连接
针对这个示例,大概过程是这样的:
时间过长,连接被回收了 可是连接被回收之后,为何其他线程获取到该连接是不可用的;连接回收了应该保证其是正常连接
针对这个示例,大概过程是这样的:
- dao.synchronizeComplainBase(complainNo, modelComplainNo);会从连接池中获取一个DruidPooledConnection的实例(为方便表达这个实例用001表示);
- Thread.sleep(60000);过程中,由于removeabndoned设置true,removeAbandonedTimeout设置10s,期间大概率执行了DestroyTask中的removeAbandoned(),进而调用了DruidPooledConnection.close(),在close()方法中会将holder设置为null,且不会将001这个实例放回连接池;
- 在执行dao.synchronizeComplainInfo(complainNo, modelComplainNo);的时候,会从Spring线程局部变量中获取到001实例。在执行操作(增删改查等)之前都会调用DruidPooledConnection.checkState进行状态检测,由于001实例的holder==null,所以抛出了上面的异常。
请看下#5920,我没配置removeabndoned
版本 1.1.9 连接池最大最小设置 1 个 removeabndoned设置true removeAbandonedTimeout设置10s 开启事务后不提交
后续再次获取连接任意数据库操作都会提示: `Caused by: java.sql.SQLException: connection holder is null