连接池不重用空闲连接

Connection pooling is not reusing idle connections

我是 HikariCP 的新手,我 运行 遇到了一个问题。我有一种使用 HikariDataSource 从数据库获取连接的方法:

public Connection getConnection() {
        try {
            return dataSource.getConnection();
        }
        catch (SQLException ex)
        {
            ex.printStackTrace();
            return null;
        }
    }

但是,当我检查 pgAdmin(顺便说一句,这是一个 PostgreSQL 数据库)时,我看到它没有使用空闲连接,而是创建了一堆新连接。我该如何解决这个问题?

下面是我向数据库发送查询后 table 的一些连接图像。 最初的:

查询后:

您可以看到在第一张图片中有 19 个连接,其中 18 个处于空闲状态。但是,经过查询,有一堆新的连接,其中大部分是空闲的。我是否配置了 Hikari 错误?这是我的配置:

config.setJdbcUrl("jdbc:postgresql://localhost/Postgres 13/BGWW Bot");
        config.setUsername();
        config.setPassword();
        config.addDataSourceProperty("max_connections", "120");
        config.addDataSourceProperty("cachePrepStmts", "true");
        config.addDataSourceProperty("prepStmtCacheSize", "250");
        config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
        config.setDataSource(ds);
        config.setMaximumPoolSize(120);
        config.setMinimumIdle(15);

最后,这是我的方法之一,它使用来自 getConnection() 的连接

public float[] getReqs()
    {
        try (Connection conn = getConnection())
        {
            String getReqs = "SELECT id, swstars, swwins, swkdr FROM reqs;";

            PreparedStatement stmt = conn.prepareStatement(getReqs);
            ResultSet rs = stmt.executeQuery();

            while(rs.next())
            {
                if(rs.getInt(1) == 1)
                {
                    float[] array = new float[]{rs.getInt(2), rs.getInt(3), rs.getFloat(4)};
                    conn.close();
                    return array;
                }
            }

            conn.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
            return null;
        }
        return null;
    }

您的配置表明池中的连接数应介于 15120 之间。

使用此配置,您可能还会观察到 空闲 状态下的 15 个连接。

属性 idleTimeout 控制连接的退出,如果它空闲了这样的时间(默认 - 10 分钟)。

换句话说,只有当您的应用程序在 10 分钟内没有访问(再加上 30 秒,因为在此期间会定期检查连接),您应该会看到最小大小的池。

更多信息见here