连接池不重用空闲连接
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;
}
您的配置表明池中的连接数应介于 15
和 120
之间。
使用此配置,您可能还会观察到 空闲 状态下的 15
个连接。
属性 idleTimeout
控制连接的退出,如果它空闲了这样的时间(默认 - 10 分钟)。
换句话说,只有当您的应用程序在 10 分钟内没有访问(再加上 30 秒,因为在此期间会定期检查连接),您应该会看到最小大小的池。
更多信息见here
我是 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;
}
您的配置表明池中的连接数应介于 15
和 120
之间。
使用此配置,您可能还会观察到 空闲 状态下的 15
个连接。
属性 idleTimeout
控制连接的退出,如果它空闲了这样的时间(默认 - 10 分钟)。
换句话说,只有当您的应用程序在 10 分钟内没有访问(再加上 30 秒,因为在此期间会定期检查连接),您应该会看到最小大小的池。
更多信息见here