JOOQ和资源处理

JOOQ and resource handling

我使用 JOOQ 来查询我的关系数据库,我最近一直在研究连接处理,这让我有点困惑。我试过阅读 JavaDoc 和这个: 但它为我制造了更多的 FUD。

目前我的代码是这样做的:

try (final Connection cn = pool.getConnection()) {
    DSLContext dsl = DSL.using(cn, MARIADB);
    // query stuff
}

从本质上讲,我只是将 JOOQ 视为一个根本不进行连接处理的查询器。我从来没有遇到过这段代码的问题。

但是,我确实收到来自 IntelliJ 的警告,说 DSLContext 是可自动关闭的,应该由 try-with-resources 处理。我知道在这种情况下不必这样做,但我的第一个问题是 'Can it?'。用这个代替上面的代码是否安全:

try (final DSLContext dsl = DSL.using(pool.getConnection(), MARIADB)) {
    // query stuff
}

另一个 Whosebug post 说,当您使用其中一种辅助方法创建 DSLContext 时,需要在 DSLContext 上使用 close() 。但是,如果您只是将 Connection 对象传入怎么办? close() 是否仍会关闭我的连接?

我还发现 DSL 有另一个 using() 允许您分配整个数据源。所以我也可以这样做:

final DSLContext dsl = DSL.using(pool, MARIADB);

然后完全忽略所有尝试资源。这里的权衡是什么?有偶数吗?

IntelliJ 进一步抱怨具有 AutoClosable 接口(继承自 Query)的 UpdateQuery。是否有必要关闭我的查询?我总是只调用 execute() 并毫无问题地关闭底层连接。

Currently my code does this:

try (final Connection cn = pool.getConnection()) {
    DSLContext dsl = DSL.using(cn, MARIADB);
    // query stuff
}

这是正确的用法。

Essentially I'm treating JOOQ as just a querier that doesn't do connection handling at all.

这是一个正确的假设。

However, I do get warnings from IntelliJ saying that DSLContext is AutoClosable and should be handled by a try-with-resources

许多 IDE 都会执行此检查,但通常最好将其关闭。在 Java 8+ 中,您不能合理地期望 AutoCloseable 真的 需要 关闭。一个这样的例子是 Stream,对于那些确实包含资源但大多数情况下不包含资源的情况,它是 AutoCloseable

This was a subtle API change in Java 8,最好关闭 IDE 中的此警告(或者您可以指定例外)。

您的问题:

Is it safe to replace the above code with this instead:

try (final DSLContext dsl = DSL.using(pool.getConnection(), MARIADB)) {
  // query stuff
}

是的,你可以做到。 DSLContext.close() 调用只会关闭由 DSLContext 创建的资源。在你的情况下,它没有任何效果。

为了记录,创建了足智多谋的 DSLContext,例如通过 DSL.using(url, username, password)

and then just leave out all the try-with-resources entirely. What are trade-offs here? Are there any even?

所有这些都与资源无关。

IntelliJ further complained about an UpdateQuery that has the AutoClosable interface (inherited from Query). Is it necessary to close my queries? I've always just called execute() and closed the underlying connection without problems.

  1. 关闭那个警告! :-)
  2. 调用时查询可以足智多谋Query.keepStatement(true)

我正在寻找的是满足这四个要求的代码

  1. 它使用正确的资源管理
  2. 它使用 JOOQ
  3. 在 IDE
  4. 中打开了 try-with-resources 警告
  5. 没有警告

上面的各种代码都至少满足了其中一个要求。但最终连接处理并不重要,因为 JOOQ 中的查询 类 也会生成大量警告。

最好的方法确实是关闭警告,但是对于 JOOQ,专门使用 Intellij 的排除规则。 Lukas 链接的页面的评论中也提到了如何执行此操作 (https://blog.jooq.org/2015/12/02/a-subtle-autocloseable-contract-change-between-java-7-and-java-8/)。

我只需要记住以正确的方式为 JOOQ 做事 类 :)