PGPool 在 SpringBoot 应用程序中无法与 HikariCP 一起使用
Posted
技术标签:
【中文标题】PGPool 在 SpringBoot 应用程序中无法与 HikariCP 一起使用【英文标题】:PGPool not working with HikariCP in SpringBoot application 【发布时间】:2019-01-17 13:45:38 【问题描述】:我已经为 Postgresql 启用了复制,并且我正在使用 PGPool 进行负载平衡。
我在使用 HikariCP 甚至使用 Apache DBCP 连接到 Postgres 时遇到问题。
有没有办法在 SpringBoot 应用程序中使用 PGPool?
请找到配置文件
spring:
datasource:
driverClassName: org.postgresql.Driver
url: jdbc:postgresql://192.168.177.148:9999/test
username: myUser
password: XXXXXXX
jpa:
properties.hibernate.dialect: org.hibernate.dialect.PostgreSQLDialect
database-platform: org.hibernate.dialect.PostgreSQLDialect
hibernate.ddl-auto: update
logging:
level:
org.springframework: DEBUG
请查找堆栈跟踪:
2018-08-10 10:20:19.124 信息 37879 --- [主要] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - 开始... 2018-08-10 10:20:20.617 错误 37879 --- [main] com.zaxxer.hikari.pool.HikariPool:HikariPool-1 - 池初始化期间出现异常。
org.postgresql.util.PSQLException:致命:无法绑定 详细信息:无法获取解析消息“” 在 org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2440) ~[postgresql-42.2.4.jar:42.2.4] 在 org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2183) ~[postgresql-42.2.4.jar:42.2.4] 在 org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:308) ~[postgresql-42.2.4.jar:42.2.4] 在 org.postgresql.core.SetupQueryRunner.run(SetupQueryRunner.java:53) ~[postgresql-42.2.4.jar:42.2.4]
018-08-10 10:20:20.620 WARN 37879 --- [main] o.s.b.a.orm.jpa.DatabaseLookup:无法从数据源确定 jdbc url
更多跟踪
org.springframework.jdbc.support.MetaDataAccessException:无法获取用于提取元数据的连接;嵌套异常是 org.springframework.jdbc.CannotGetJdbcConnectionException: 获取 JDBC 连接失败;嵌套异常是 org.postgresql.util.PSQLException: FATAL: 无法绑定 详细信息:无法获取解析消息“” 在 org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:328) ~[spring-jdbc-5.0.8.RELEASE.jar:5.0.8.RELEASE] 在 org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:356) ~[spring-jdbc-5.0.8.RELEASE.jar:5.0.8.RELEASE] 在 org.springframework.boot.autoconfigure.orm.jpa.DatabaseLookup.getDatabase(DatabaseLookup.java:72) ~[spring-boot-autoconfigure-2.0.4.RELEASE.jar:2.0.4.RELEASE]
更多跟踪
原因:org.springframework.jdbc.CannotGetJdbcConnectionException: 获取JDBC连接失败;嵌套异常是 org.postgresql.util.PSQLException: FATAL: 无法绑定 详细信息:无法获取解析消息“” 在 org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:81) ~[spring-jdbc-5.0.8.RELEASE.jar:5.0.8.RELEASE] 在 org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:319) ~[spring-jdbc-5.0.8.RELEASE.jar:5.0.8.RELEASE] ...省略了61个常用框架 引起:org.postgresql.util.PSQLException:致命:无法绑定 详细信息:无法获取解析消息“” 在 org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2440) ~[postgresql-42.2.4.jar:42.2.4] 在 org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2183) ~[postgresql-42.2.4.jar:42.2.4] 在 org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:308) ~[postgresql-42.2.4.jar:42.2.4] 在 org.postgresql.core.SetupQueryRunner.run(SetupQueryRunner.java:53) ~[postgresql-42.2.4.jar:42.2.4] 在 org.postgresql.core.v3.ConnectionFactoryImpl.runInitialQueries(ConnectionFactoryImpl.java:674) ~[postgresql-42.2.4.jar:42.2.4] 在 org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:223) ~[postgresql-42.2.4.jar:42.2.4] 在 org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49) ~[postgresql-42.2.4.jar:42.2.4] 在 org.postgresql.jdbc.PgConnection.(PgConnection.java:195) ~[postgresql-42.2.4.jar:42.2.4] 在 org.postgresql.Driver.makeConnection(Driver.java:454) ~[postgresql-42.2.4.jar:42.2.4] 在 org.postgresql.Driver.connect(Driver.java:256) ~[postgresql-42.2.4.jar:42.2.4] 在 com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:117) ~[HikariCP-2.7.9.jar:na] 在 com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:123) ~[HikariCP-2.7.9.jar:na] 在 com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:365) ~[HikariCP-2.7.9.jar:na]
【问题讨论】:
你得到什么错误/堆栈跟踪?另外,如果可能的话,共享配置文件/类 嗨@RajaAnbazhagan,感谢您的回复。我已经更新了我的问题。请看一看。 【参考方案1】: 我们的场景我们在 Kubernetes 集群上也遇到了几乎相同的问题。数据库已关闭,HikariCP 无法正确验证连接。异常是由 Spring Boot 应用程序给出的,如下所示:
2020-01-06 09:38:13.013 WARN 1 --- [nio-8080-exec-8] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection org.postgresql.jdbc.PgConnection@490c2ee7 (This connection has been closed.)
2020-01-06 09:38:13.045 WARN 1 --- [nio-8080-exec-8] org.postgresql.jdbc.PgConnection : Validating connection.
org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend.
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:333) ~[postgresql-42.2.2.jar!/:42.2.2]
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:441) ~[postgresql-42.2.2.jar!/:42.2.2]
... common frames omitted
Caused by: java.io.EOFException: null
at org.postgresql.core.PGStream.receiveChar(PGStream.java:295) ~[postgresql-42.2.2.jar!/:42.2.2]
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1947) ~[postgresql-42.2.2.jar!/:42.2.2]
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:306) ~[postgresql-42.2.2.jar!/:42.2.2]
... 111 common frames omitted
解决方案
为了解决这个问题,我们在 Spring Boot 应用程序中为 Hikari 提供了以下属性。
spring.datasource.hikari.leakDetectionThreshold=5000
spring.datasource.hikari.maxLifetime=900000
logging.level.com.zaxxer.hikari=DEBUG
参考文献
https://github.com/brettwooldridge/HikariCP/issues/1237
HikariPool-1 - Failed to validate connection org.postgresql.jdbc.PgConnection@2a84e649 (This connection has been closed.)
【讨论】:
以上是关于PGPool 在 SpringBoot 应用程序中无法与 HikariCP 一起使用的主要内容,如果未能解决你的问题,请参考以下文章