我们已经使用 HikariCP 和 impossibl/pgjdbc-ng 驱动程序实现了一个 spring-boot 应用程序。只要数据库连接 url 引用 postgres 数据库,应用程序就可以正常运行。但是,当数据库 url 包含 pgbouncer 的地址时,应用程序无法启动并显示以下错误消息:
2021-11-24 09:26:36,575 ERROR [main] com.zaxxer.hikari.pool.HikariPool: 594 - Exception during pool initialization. {}
com.impossibl.postgres.jdbc.PGSQLSimpleException: Connection Error: prepared statement "TB" already exists
at com.impossibl.postgres.jdbc.ErrorUtils.makeSQLException(ErrorUtils.java:197)
at com.impossibl.postgres.jdbc.ErrorUtils.makeSQLException(ErrorUtils.java:134)
at com.impossibl.postgres.jdbc.ConnectionUtil.createConnection(ConnectionUtil.java:326)
at com.impossibl.postgres.jdbc.ConnectionUtil.createConnection(ConnectionUtil.java:279)
at com.impossibl.postgres.jdbc.PGDriver.connect(PGDriver.java:104)
at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138)
at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364)
at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206)
at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476)
at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561)
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115)
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112)
at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:180)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:68)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35)
...
我找到了一些建议,用另一个数据源实现替换 HikariCP 来解决问题,但这不是一个选项,因为我们不想更改我们的应用程序。所以我的问题是:
- 错误信息的原因是什么?
- 是否可以通过向 JDBC URL 添加一些参数来解决问题?
提前致谢!