使用HikariCP+GCP IAM认证时反复创建连接触发连接槽耗尽错误
问题
我编写了一个循环创建并关闭PostgreSQL数据库连接的程序,采用HikariCP连接池与Google Cloud IAM认证方式。程序在第6-7次循环时触发错误,若每次循环间隔5秒则第3次就报错。打印连接状态显示已成功关闭,无连接泄漏迹象,但仍出现错误:FATAL: remaining connection slots are reserved for non-replication superuser connections。
相关代码
Tester类
package Tester; import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource; import InstanceCreator.InstanceCreator; public class Tester { public static void main(String[] args) throws SQLException, InterruptedException { int i = 1; while (true) { System.out.println("Starting loop: " + i); i++; Thread.sleep(5000); DataSource dataSource = InstanceCreator.createConnectionPool(); Connection connection = null; try { connection = dataSource.getConnection(); } catch (SQLException e) { e.printStackTrace(); } finally { connection.close(); } } } }
InstanceCreator类
package InstanceCreator; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import javax.sql.DataSource; public class InstanceCreator { private static final String INSTANCE_CONNECTION_NAME = "mycreds"; private static final String DB_IAM_USER = "mycreds"; private static final String DB_NAME = "mycreds"; public static DataSource createConnectionPool() { HikariConfig config = new HikariConfig(); config.setJdbcUrl(String.format("jdbc:postgresql:///%s", DB_NAME)); config.addDataSourceProperty("socketFactory", "com.google.cloud.sql.postgres.SocketFactory"); config.addDataSourceProperty("cloudSqlInstance", INSTANCE_CONNECTION_NAME); config.addDataSourceProperty("enableIamAuth", "true"); config.addDataSourceProperty("user", DB_IAM_USER); config.addDataSourceProperty("password", "password"); config.addDataSourceProperty("sslmode", "disable"); return new HikariDataSource(config); } }
报错信息
Starting loop: 1 SLF4J(警告): 未找到SLF4J提供者。 SLF4J(警告): 默认使用无操作(NOP)日志实现。 SLF4J(警告): 可查看SLF4J官方文档了解更多详情。 Starting loop: 2 Starting loop: 3 Starting loop: 4 Starting loop: 5 Starting loop: 6 Starting loop: 7 Exception in thread "main" com.zaxxer.hikari.pool.HikariPool$PoolInitializationException: Failed to initialize pool: FATAL: remaining connection slots are reserved for non-replication superuser connections at com.zaxxer.hikari.pool.HikariPool.throwPoolInitializationException(HikariPool.java:596) at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:582) at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:81) at InstanceCreator.InstanceCreator.createConnectionPool(InstanceCreator.java:27) at Tester.Tester.main(Tester.java:17) Caused by: org.postgresql.util.PSQLException: FATAL: remaining connection slots are reserved for non-replication superuser connections at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2676) at org.postgresql.core.v3.QueryExecutorImpl.readStartupMessages(QueryExecutorImpl.java:2788) at org.postgresql.core.v3.QueryExecutorImpl.<init>(QueryExecutorImpl.java:174) at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:313) at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:54) at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:253) at org.postgresql.Driver.makeConnection(Driver.java:434) at org.postgresql.Driver.connect(Driver.java:291) at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:121) 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) ... 4 more
内容的提问来源于stack exchange,提问作者Quinn Larson
相关产品推荐
相关产品推荐

