【问题标题】:Hikari Unable to acquire JDBC ConnectionHikari 无法获取 JDBC 连接
【发布时间】:2019-01-10 21:39:52
【问题描述】:

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

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

原因:org.springframework.dao.DataAccessResourceFailureException: Unable to acquire JDBC Connection;嵌套异常是 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

哪位大神可以指点一下,谢谢!

【问题讨论】:

  • 能否至少告诉我们,您使用的是哪些版本?
  • HikariCP-3.2.0 Mysql 6.0.6 Spring boot 1.5.3.RELEASE Hibernate 5.0.9.Final

标签: java hikaricp


【解决方案1】:

您可能有未关闭的未关闭交易。随着时间的推移,这些事务不断堆积,无法打开新的连接。连接超时命中,您将无法获取 JDBC 连接。

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

我想添加一个我们遇到这些问题的特定场景。这涉及使用 @Transactional 注释的方法 在此方法中打开的数据库连接将在打开的事务中,直到此方法退出。我们的程序的问题是,它只进行了少量 HTTP 调用,并且在 HTTP 调用完成之前事务将一直打开。随着对该服务方法的调用越来越多,越来越多的事务处于打开状态而不是关闭状态。

故事的寓意:打开交易,快速做你的事情,然后关闭交易;通过退出标记为@Transactional 的方法隐式地或通过显式调用事务关闭。

【讨论】:

  • 您知道如何在 DB 级别甚至 Spring Boot 级别查看打开的事务吗?
  • 您可以使用 grafana 和 mysql monitor 检查打开的连接。我们已经为 Spring Boot 设置了它
猜你喜欢
  • 2017-11-09
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-12
  • 2017-09-03
  • 2019-04-18
相关资源
最近更新 更多