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 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

pgpool中定义的数据库节点及pgpool支持的复制模式

使用pgpool管理数据库集群故障的问题

使用 UPDATE 处理 CTE 的 pgpool

Pgpool-II 模式初步浅析

如何从挂起的 pgPool.connect() 中获取响应/信息?

Postgresql流复制+pgpool实现高可用