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()并关闭底层连接而没有问题。
- 关掉那个警告! :-)
- 调用
Query.keepStatement(true)
时,查询可以是足智多谋的
我正在寻找的是满足这四个要求的代码
- 它使用正确的资源管理
- 它使用JOOQ
- 在IDE中打开了try-with-resources警告
- 没有警告
上面的各种代码都至少失败了其中一个要求。但最终连接处理并不重要,因为JOOQ中的查询类也会产生大量警告。
确实最好的方法是关闭警告,但是对于JOOQ,特别是使用Intellij的排除规则。如何做到这一点在Lukas链接的页面上的评论中提到(https://blog.jooq.org/2015/12/02/a-subtle-autocloseable-contract-change-between-java-7-and-java-8/)。
我只需要记住为JOOQ课程做正确的事情:)
以上是关于JOOQ和资源处理的主要内容,如果未能解决你的问题,请参考以下文章
Python 自动化 - 浏览器chrome打开F12开发者工具自动Paused in debugger调试导致无法查看网站资源问题原因及解决方法,javascript反调试问题处理实例演示(代码片段
springboot+kotlin+gradle+jooq的学习笔记