【问题标题】:Why HikariCP creates so many idle connections in postgresql为什么 HikariCP 在 postgresql 中创建这么多空闲连接
【发布时间】:2018-05-08 12:57:51
【问题描述】:

我有一个在 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 抱怨连接太多。有没有人遇到过这种情况,请帮忙。

【问题讨论】:

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


【解决方案1】:

setMinimumIdle(100) 将在启动时创建 100 个连接,这是不必要/不好的做法。

您应该根据Hikari connection pool grows to maximum size at start 答案降低您的空闲连接和最大池大小

如果您有 3 个活动节点(和 1 个备份),并且在生产中每个节点通常需要 5-6 个连接,则可能将 maximumPoolSize 设置为 20,将 minimumIdle 设置为 2,并将 idleTimeout 设置为 2 分钟(120000 毫秒)左右。

所以在你的情况下改变两行:

config.setMinimumIdle(2);
config.setMaximumPoolSize(20);

【讨论】:

  • 我仍然得到一些空白的空闲连接并且它们没有关闭
  • glassfish 是否与这些问题有关