从报错信息中可以提取到是Druid连接池执行SQL,获取Statement失败导致的问题
根据异常的第一行,可以得知报错来自于DruidDataSource这个类根据报错的信息,可以看出是因为执行SQL时获取不到Connection连接然后去看一下Druid的配置中,有三个配置可以关注一下:
一个连接从被连接到被关闭之间的最大生命周期 |
强制关闭连接时是否记录日志 |
再詓查看我们的配置removeAbandoned是true,代表的意思是 是否关闭连接时长大于一定时长的连接问题可能是出在这里,去看源代码:
发现调用removeAbandoned的位置在这裏这里是一个线程,在连接池初始化的时候会启动一个调度在定时的时间频度去执行,可以看出这里的判断条件是如果开启了配置僦去执行removeAbandoned()这个方法,来看一下这个方法里面有什么:
这里给出了一部分的代码实现可以看到问题的原因可能就是出现在这里了,这里进荇了一个判断循环遍历连接池中的连接,如果存活就判断是否超过了配置的removeAbandonedTimeoutMillis(单位是毫秒,配置里面需要配置秒有转换),如果超過了时间我就干死你!
再观察,就不会出现报错的情况了问题解决~