问题
启动后每运行一段时间,就会开始报错,且一直就是这个错误了:
java.sql.SQLTransientConnectionException: HikariPool-2 - Connection is not available, request timed out after 60000ms.
at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:689)
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:196)
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:161)
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:128)
at com.huizhaofang.stats.service.processor.CompanyBasicsProcessor.getData(CompanyBasicsProcessor.java:36)
at com.huizhaofang.stats.service.impl.CompanyBasicsServiceImpl.sendData(CompanyBasicsServiceImpl.java:33)
at com.huizhaofang.stats.handler.qftstats.CompanyBasicsHandler.execute(CompanyBasicsHandler.java:25)
at com.xxl.job.core.thread.JobThread$1.call(JobThread.java:134)
at com.xxl.job.core.thread.JobThread$1.call(JobThread.java:131)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.lang.Thread.run(Thread.java:745)
看字面意思是超时,其实是连接池满了。通过在 config/logback.xml 调整 HikariPool 日志级别看看到:
<Logger name="com.zaxxer.hikari" level="DEBUG">
<appender-ref ref="STDOUT" />
</Logger>
可观察到日志:
DEBUG com.zaxxer.hikari.pool.HikariPool:417 - HikariPool-1 - Pool stats (total=10, active=10, idle=0, waiting=0)
说明连接池由于泄漏导致耗尽了。
解决办法
务必在 finally 关闭 Connection
Connection conn = null;
try {
conn = jdbcTemplate.getDataSource().getConnection();
// 处理逻辑....
return table;
} catch (IOException | SQLException e) {
log.error("Exception:{}", e);
} finally {
if (null != conn) {
try {
conn.close();
} catch (SQLException e) {
}
}
}