我有一个在glassfish5上运行的JSP应用程序,其中postgresql作为数据库服务。为了管理连接,我选择了HikariCP,如下所示
config.setDataSourceClassName("org.postgresql.ds.PGSimpleDataSource");
config.addDataSourceProperty("serverName", host);
config.addDataSourceProperty("portNumber", port);
config.addDataSourceProperty("databaseName", database);
config.addDataSourceProperty("user", username);
config.addDataSourceProperty("password", password);
config.addDataSourceProperty("assumeMinServerVersion", postrgesVersion);
config.setMinimumIdle(100);
config.setMaximumPoolSize(100);
config.setAutoCommit(false);
config.setIdleTimeout(3000);
ds = new HikariDataSource(config);
以这种方式实现数据源
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
当我在pgAdmin
中运行以下查询时select datname,pid,usename,client_addr,client_port,backend_start,query,state from pg_stat_activity where datname = 'db_name' AND client_addr='10.1.0.56'
我得到以下结果,其中包含许多没有任何查询的连接,如下图所示
几秒后,postgres抱怨连接太多了。有没有人经历过这样的事情,请帮助。
答案 0 :(得分:1)
setMinimumIdle(100)
将在启动时创建100个连接,这是不必要/不好的做法。
您应该根据Hikari connection pool grows to maximum size at start回答
降低空闲连接和最大池大小如果你有3个活动节点(和1个备份),并且在生产中每个节点通常需要5-6个连接,可能将maximumPoolSize设置为20,minimumIdle设置为2,idleTimeout设置为2分钟(120000ms)。
所以在你的情况下改变两行:
config.setMinimumIdle(2);
config.setMaximumPoolSize(20);