数据库连接池上的尝试资源是否每次都会关闭连接吗?

问题描述 投票:1回答:2

我正在使用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();
        });
    }
java postgresql prepared-statement connection-pooling try-with-resources
2个回答
2
投票
  1. 否,当调用close()时,连接将返回到池中。连接池的Connection包装器会以这种方式覆盖close(),以便该池可以正常工作。
  2. 未关闭。
  3. 就像平时一样。使用连接池很少需要任何特殊的操作,如果您打算调整连接池,则需要测量性能并真正知道您要执行的操作。

0
投票

ConnectionPool仅在调用getConnection()时才会创建新的连接。

它将创建新的连接,直到ConnectionPool配置中指定的最大连接数。如果创建了新的连接,已使用并调用了close(),则它将返回到池中并保持活动状态。

[如果另一个线程调用getConnection(),则pool将此活动连接提供给该线程。如果ConnectionPool中没有可用的活动连接,则它将创建一个新的连接并返回。

© www.soinside.com 2019 - 2024. All rights reserved.