JOOQ和资源处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JOOQ和资源处理相关的知识,希望对你有一定的参考价值。

我使用JOOQ来查询我的关系数据库,我最近一直在研究连接处理,它让我有点困惑。我已经尝试过阅读JavaDoc以及这个:When is a Connection closed when calling JooQ DSLContext's .close(), if at all?但它为我创造了更多的FUD。

目前我的代码执行此操作:

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

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

但是,我确实从IntelliJ收到警告说DSLContext是AutoClosable,应该通过try-with-resources来处理。我知道在这种情况下没有必要,但我的第一个问题是'可以吗?'。用这个代替上面的代码是否安全:

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

另一个StackOverflow帖子说当你使用其中一个辅助方法创建它时,你需要在DSLContext上使用close()。但是如果你刚刚传递了Connection对象呢? close()是否仍会关闭我的连接?

我还发现DSL有另一个using()允许你分配一个完整的DataSource。所以我也可以这样做:

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

然后完全忽略所有的资源尝试。什么是权衡取舍?有没有呢?

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

答案

目前我的代码执行此操作:

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

这是正确的用法。

基本上我将JOOQ视为一个根本不进行连接处理的查询器。

这是一个正确的假设。

但是,我确实从IntelliJ收到警告,说DSLContext是AutoClosable,应该通过try-with-resources来处理

许多IDE都会进行此检查,但通常最好关闭它们。在Java 8+中,您无法合理地期望AutoCloseable真正需要关闭。一个这样的例子是Stream,对于那些确实包含资源的情况来说是AutoCloseable,但大多数情况下并非如此。

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

Your questions:

用这个代替上面的代码是否安全:

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

是的,你可以这样做。 DSLContext.close()调用只会关闭DSLContext创建的资源。在您的情况下,它没有任何影响。

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

然后完全忽略所有的资源尝试。什么是权衡取舍?有没有呢?

所有这些都与资源无关。

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

  1. 关掉那个警告! :-)
  2. 调用Query.keepStatement(true)时,查询可以是足智多谋的
另一答案

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

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

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

确实最好的方法是关闭警告,但是对于JOOQ,特别是使用Intellij的排除规则。如何做到这一点在Lukas链接的页面上的评论中提到(https://blog.jooq.org/2015/12/02/a-subtle-autocloseable-contract-change-between-java-7-and-java-8/)。

我只需要记住为JOOQ课程做正确的事情:)

以上是关于JOOQ和资源处理的主要内容,如果未能解决你的问题,请参考以下文章

JOOQ 使用 Maven 代码生成设置 Oracle

JOOQ用法和实例

Python 自动化 - 浏览器chrome打开F12开发者工具自动Paused in debugger调试导致无法查看网站资源问题原因及解决方法,javascript反调试问题处理实例演示(代码片段

springboot+kotlin+gradle+jooq的学习笔记

springboot+kotlin+gradle+jooq的学习笔记

JOOQ 与休眠行为