Hikari无法获取JDBC连接

时间:2018-08-03 03:58:35

标签: java hikaricp

我们的项目中有Spring-boot / Hibernate / MYSQL应用程序,并使用Hikari作为连接池。在启动我们的服务几分钟后,我们发现了以下问题:

  

org.springframework.web.util.NestedServletException:请求处理失败;嵌套的异常是org.springframework.dao.DataAccessResourceFailureException:无法获取JDBC连接。嵌套的异常是org.hibernate.exception.JDBCConnectionException:无法获取JDBC连接

     

原因:org.springframework.dao.DataAccessResourceFailureException:无法获取JDBC连接。嵌套的异常是org.hibernate.exception.JDBCConnectionException:无法获取JDBC连接

我们的数据源配置如下:


spring.datasource.type = com.zaxxer.hikari.HikariDataSource

spring.datasource.hikari.connection-timeout = 36000

spring.datasource.hikari.maximum-pool-size = 2

spring.datasource.hikari.max-lifetime = 1800000

spring.datasource.hikari.idle-timeout = 60000

spring.datasource.hikari.validation-timeout = 3000

spring.datasource.hikari.leak-detection-threshold = 240000

这里的任何人都可以给我一些线索,谢谢!

1 个答案:

答案 0 :(得分:1)

您可能打开了从未关闭过的事务。随着时间的流逝,这些事务不断堆积,无法打开新的连接。连接超时命中,您将无法获取JDBC连接。

您需要检查所有事务处理方法,并确保在完成后立即关闭/提交它们。

我想添加一个特定的场景来解决这些问题。这涉及用@Transactional注释的方法 在此方法退出之前,在此方法中打开的数据库连接将位于打开的事务中。我们程序的问题在于,这很少进行HTTP调用,并且在HTTP调用完成之前,事务将一直打开。随着对这种服务方法的调用不断堆积,处于打开状态的交易比被关闭的交易更多。

故事的寓意:打开交易,快速完成任务,然后关闭交易;可以通过退出标记为@Transactional的方法来隐式地进行,也可以通过显式调用事务关闭来隐式进行。