当前位置: 首页 > 知识库问答 >
问题:

连接池不是重用空闲连接

糜征
2023-03-14

我对HikariCP很陌生,我遇到了一个问题。我有一个使用hikaridaTasource从数据库获取连接的方法:

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

但是,当我检查pgAdmin(这是一个PostgreSQL db btw)时,我看到它没有使用空闲连接,而是创建了一堆新连接。我怎么才能修好这个?

您可以看到,在第一个图像中有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;
    }

共有1个答案

朱修真
2023-03-14

您的配置说明池中的连接数应该在15120之间。

使用此配置,您还可以观察到更多15处于空闲状态的连接。

属性Idletimeout控制连接空闲一段时间(默认值为10分钟)时的退出。

 类似资料:
  • null 如果我理解正确的话,我们应该在启动时有1个空闲连接,根据负载从0到3,对吗? 正在发生的情况是:启动时1个连接,如果负载较低,最多3个空闲连接,高负载后超过3个空闲连接。然后这些连接不会立即关闭,我们不知道它们何时/是否会关闭(有时它们中的一些会关闭)。 所以问题是:这种行为正常吗? DAO子类的使用示例:

  • 在OkHttp中,我找不到设置硬最大连接池大小的方法。从留档https://square.github.io/okhttp/3.x/okhttp/okhttp3/ConnectionPool.html很明显,您可以设置最大空闲连接,但不能设置整体最大值。这意味着在高负载下,它可以增长超过任何限制。 有没有办法最大化池?如果没有,为什么没有?

  • > 可能是我有这个确切的问题https://github.com/brettwooldridge/hikaricp/issues/109在我的例子中,活动连接随着每个事务的增加而增加。 HikariCP-连接不可用这也是一个相同的问题。但没有人对此提供明确的解决方案。顺便说一句,我使用了begging中的。

  • 在配置DBCP2池时,根据文档,我注意到-有一个名为timebetweenvictionrunsmillis的配置,描述如下: 空闲对象逐出器线程运行之间的Hibernate毫秒数。如果为非正,则不会运行空闲对象逐出器线程。 其默认值为-1。 这是否意味着逐出器线程永远不会在默认配置下运行?那么配置参数maxIdle是如何强制的?如果空闲连接的计数大于maxIdle,池必须退出空闲连接。 默认配置

  • 问题内容: 我看到许多连接处于打开状态,并且很长一段时间(例如5分钟)保持空闲状态。 有什么解决方案可以在不重新启动mysql服务的情况下从服务器终止/关闭它? 我正在维护旧的PHP系统,无法关闭为执行查询而建立的连接。 我应该将my.cnf文件中的超时值减少为默认的8小时吗? 问题答案: 手动清理: 您可以杀死该进程ID。 但: php应用程序可能会报告错误(或网络服务器,请检查错误日志) 不要