我正在使用HikariDataSource管理与我的Postgres DB的连接池。
我正在尝试使用一种资源来从HikariDataSource获取连接,我想了解以下内容:
1)每次连接是否真的关闭?
2)如果是,以这种方式使用准备好的语句没有好处吗?
3)在连接池中使用预备语句的最佳实践是什么?
这是我的连接代码:
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()
时,连接将返回到池中。包装器将以这种方式覆盖close()
,以便池可以工作。