如何解决在Spring Boot应用程序中以编程方式重新启动HikariPool?
我有一个使用Hibernate和HikariDataSource / HikariPool与数据库对话的Spring Boot应用程序。
应用程序中的一项特殊功能触发数据库重新启动。目前,这会中断HikariPool中的连接:
Caused by: org.postgresql.util.PSQLException: ERROR: relation "relation_which_really_exists" does not exist
Position: 113
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2532)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2267)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:312)
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:448)
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:369)
该应用的旧版本确实以编程方式调用org.hibernate.SessionFactory.close();
,这会导致重新启动HikariDataSource / HikariCP:
2020-08-17T11:36:42.628Z [qtp1340328248-76] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated...
2020-08-17T11:36:42.698Z [qtp1340328248-76] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed.
2020-08-17T11:36:51.266Z [qtp1340328248-12] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-2 - Starting...
2020-08-17T11:36:51.515Z [qtp1340328248-12] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-2 - Start completed.
我也想这样做,但是如何以编程方式重新启动应用程序中的连接池?我见过类似Spring Boot - Handle to Hibernate SessionFactory这样的东西来获取sessionFactory的句柄,也许也有类似的东西来获取DataSource或CP的句柄...。但是可以强烈地关闭/重新启动这些对象,这是Spring Boot吗?上下文设计师可以正确处理此类操作?
也许我可以开始尝试一些HikariCP配置参数以尝试达到相同的最终结果,但是将旧的实现方式复制为最容易/最清楚并且最有可能达到相同最终结果的尝试。
解决方法
HikariCP中有一个参数为 connectionTestQuery 这是将在从池中为您提供连接之前执行的查询,以验证与数据库的连接仍然有效。因此,我认为您可以使用它来检查连接是否仍然有效,然后强制执行操作。但是他们在文档“如果驱动程序支持JDBC4时强烈建议不要设置此属性。这是针对不支持JDBC4 Connection.isValid()API的“旧版”驱动程序”的
,经过研究,发现可以通过以下方式获得HikariCP的处理并触发驱逐连接:
HikariDataSource hikariDs = (HikariDataSource) dataSource;
HikariPoolMXBean poolBean = hikariDs.getHikariPoolMXBean();
poolBean.softEvictConnections();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。