我正在使用HikariDataSource管理与我的Postgres DB的连接池。
我正在尝试使用一种资源来从HikariDataSource获取连接,我想了解以下内容:
每次连接是否真的关闭?
如果是,用这种方式处理准备好的语句没有好处吗?
将准备好的语句与连接池一起使用的最佳实践是什么?
这是我的连接代码:
public <T> CompletableFuture<T> withConnection(FunctionThatThrowsChecedException<Connection, T> action) {
return CompletableFuture.supplyAsync(() -> {
try (Connection connection = ds.getConnection()) {
return action.apply(connection);
} catch (SQLException | IOException e) {
throw new RuntimeException("error while getting collection", e);
}
}, workerThreads);
}
这里有一个使用预准备语句执行查询的示例:
public CompletableFuture<Integer> delete(String batchId) {
return postgresProvider.withConnection(connection -> {
PreparedStatement ps = connection.prepareStatement(DELETE_QUERY);
ps.setString(1, batchId);
return ps.executeUpdate();
});
}
close()
时,连接将返回到池中。连接池的Connection
包装器会以这种方式覆盖close()
,以便该池可以正常工作。ConnectionPool仅在调用getConnection()
时才会创建新的连接。
它将创建新的连接,直到ConnectionPool配置中指定的最大连接数。如果创建了新的连接,已使用并调用了close()
,则它将返回到池中并保持活动状态。
[如果另一个线程调用getConnection()
,则pool将此活动连接提供给该线程。如果ConnectionPool中没有可用的活动连接,则它将创建一个新的连接并返回。