【问题标题】:Does try-with resource on db connection pool close the connection each time?db连接池上的try-with资源是否每次都会关闭连接?
【发布时间】:2020-03-23 22:26:05
【问题描述】:

我正在使用 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


    【解决方案1】:
    1. 不,当调用close() 时,连接将返回到池中。连接池的 Connection 包装器会以这种方式覆盖 close(),以便池可以工作。
    2. 它没有关闭。
    3. 就像你平时做的那样。使用连接池很少需要任何特殊的东西,如果您打算调整连接池,则需要衡量性能并真正了解您要执行的操作。

    【讨论】:

    • 谢谢。我看到了许多初始化新连接池的示例,这些示例将使用缓存声明为 true。我正在尝试读取 PGSimpleDataSource 缓存默认值,但没有运气。当你说它很少需要什么特别的东西时,为什么所有的例子都声明它为真?
    • @Udi 我不知道你在看什么样的例子。也许 db/cp 组合确实需要该配置,也许您正在阅读低质量的教程。我刚才说了,不管你用不使用连接池,你使用PreparedStatement的方式都是一样的。我没有说连接池不需要配置,尽管例如 HikariCP 有很好的默认值。
    • 从代码的角度来看是否使用 cp 的区别在于,如果我不使用 CP,那么我可以在初始化连接后立即在类级别全局创建 Prepared 语句,并且然后随时使用它。使用 cp 时,我需要像上面那样在功能级别创建新的 PS,因为每次都可以是不同的连接。你同意吗?
    • @Udi global PreparedStatements 是不必要且不相关的。它也不会为您提供准备好的语句缓存,因为这是在数据库端处理的。您需要对 JDBC 规范(以及特定于驱动程序的怪异)有一个很好的掌握才能了解真正发生的事情。准备好的语句缓存并不像你想象的那么简单。您可能正在使用全局变量缓存 PreparedStatement,但这并不等同于“缓存准备好的语句”,这是在没有全局变量的情况下数据库可以完美完成的事情。
    • @Kayman 非常感谢。我不知道。我会更多地阅读它。再次感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    相关资源
    最近更新 更多