为什么HikariCP在postgresql中创建了这么多空闲连接

时间:2018-05-08 12:57:52

标签: postgresql glassfish database-connection postgresql-9.4 hikaricp

我有一个在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'

我得到以下结果,其中包含许多没有任何查询的连接,如下图所示

enter image description here

几秒后,postgres抱怨连接太多了。有没有人经历过这样的事情,请帮助。

1 个答案:

答案 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);