线上的代码之前运行的都很平稳,突然就出现了一个很奇怪的问题,看错误信息是第三方框架Druid报出来了,连接池回收连接时出现的问题。
#### 20231211 10:39:21,592 | INFO | Epoint.PingBiao.Core.CmFunction | 登录系统
#### 20231211 10:39:22,436 | INFO | Epoint.PingBiao.Core.CmFunction | 加载项目管理页面
#### 20231211 10:39:22,964 | INFO | Epoint.PingBiao.Core.CmFunction | fffffffff
#### 20231211 10:39:23,738 | ERROR | com.alibaba.druid.pool.DruidDataSource | recyle error
java.lang.InterruptedException
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireInterruptibly(AbstractQueuedSynchronizer.java:1220)
at java.util.concurrent.locks.ReentrantLock.lockInterruptibly(ReentrantLock.java:335)
at com.alibaba.druid.pool.DruidDataSource.recycle(DruidDataSource.java:1281)
at com.alibaba.druid.pool.DruidPooledConnection.recycle(DruidPooledConnection.java:293)
at com.alibaba.druid.filter.FilterChainImpl.dataSource_recycle(FilterChainImpl.java:4541)
at com.alibaba.druid.filter.logging.LogFilter.dataSource_releaseConnection(LogFilter.java:817)
at com.alibaba.druid.filter.FilterChainImpl.dataSource_recycle(FilterChainImpl.java:4537)
at com.alibaba.druid.pool.DruidPooledConnection.syncClose(DruidPooledConnection.java:270)
at com.alibaba.druid.pool.DruidPooledConnection.close(DruidPooledConnection.java:228)
at com.epoint.database.jdbc.connection.DatasourceConnectionProvider.closeConnection(mh:203)
at com.epoint.database.jdbc.impl.DBImpl.close(ld:182)
at com.epoint.database.peisistence.PersistenceService.closeDataSource(db:139)
at com.epoint.core.dao.CommonDao.close(pj:529)
at sun.reflect.GeneratedMethodAccessor263.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.epoint.check.util.CheckReflectUtil.invokeMethodWithObjHasParame(CheckReflectUtil.java:456)
at com.epoint.check.util.CheckReflectUtil.invokeMethodWithObjHasParame(CheckReflectUtil.java:316)
at com.epoint.check.util.CheckReflectUtil.invokeMethodWithObjHasParame(CheckReflectUtil.java:285)
at com.epoint.check.util.CheckReflectUtil.invokeMethodWithObj(CheckReflectUtil.java:270)
at com.epoint.check.util.CheckSqlUtil.find(CheckSqlUtil.java:396)
at com.epoint.ztb.check.upload.service.KeyIndexService.findIndexes(KeyIndexService.java:130)
at com.epoint.ztb.check.upload.service.KeyIndexService.getKeyIndexInfo(KeyIndexService.java:67)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.epoint.ztb.check.timertask.ZtbCheckJsonTask.call(ZtbCheckJsonTask.java:33)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
看了一下也没有发现所以然,然后去GitHub上的Druid官方开源处,看了一下历史问题修复,发现这个是旧版本已知的一个Bug。
请不要吞没和忽略 java.lang.InterruptedException · Issue #785 · alibaba/druid · GitHub看了一下当前使用的Druid的版本【1.0.11】,然后又确认了一下官方最新的版本是【1.1.9】,已经差了很多个版本了。果断将版本更新至最新
更新到最新版本后,上述问题得到解决。
数据库连接被中断的原因有很多,有一种是初始化配置时设置的数据库连接回收时长,通过datasource.getConnontion() 取得的连接必须在removeAbandonedTimeout这么多秒内调用close(),否则就主动将其杀死,就是conn不能超过指定的租期。