Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JOOQ与资源处理_Java_Intellij Idea_Connection_Jooq_Try With Resources - Fatal编程技术网

Java JOOQ与资源处理

Java JOOQ与资源处理,java,intellij-idea,connection,jooq,try-with-resources,Java,Intellij Idea,Connection,Jooq,Try With Resources,我使用JOOQ查询我的关系数据库,最近我一直在研究连接处理,它让我有点困惑。我试着阅读JavaDoc和以下内容:但它为我创建了更多的FUD 目前,我的代码执行以下操作: try (final Connection cn = pool.getConnection()) { DSLContext dsl = DSL.using(cn, MARIADB); // query stuff } try (final Connection cn = pool.getConnection()

我使用JOOQ查询我的关系数据库,最近我一直在研究连接处理,它让我有点困惑。我试着阅读JavaDoc和以下内容:但它为我创建了更多的FUD

目前,我的代码执行以下操作:

try (final Connection cn = pool.getConnection()) {
    DSLContext dsl = DSL.using(cn, MARIADB);
    // query stuff
}
try (final Connection cn = pool.getConnection()) {
    DSLContext dsl = DSL.using(cn, MARIADB);
    // query stuff
}
本质上,我将JOOQ视为一个根本不进行连接处理的查询器。我从来没有遇到过这个代码的问题

然而,我确实收到IntelliJ的警告,说DSLContext是自动关闭的,应该通过资源试用来处理。我知道在这种情况下不必这样做,但我的第一个问题是“可以吗?”。用以下代码替换上述代码是否安全:

try (final DSLContext dsl = DSL.using(pool.getConnection(), MARIADB)) {
    // query stuff
}
try (final DSLContext dsl = DSL.using(pool.getConnection(), MARIADB)) {
  // query stuff
}
另一篇StackOverflow文章说,当您使用一个helper方法创建DSLContext时,需要在DSLContext上使用close()。但是如果您只是传入了连接对象呢?close()还会关闭我的连接吗

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

final DSLContext dsl = DSL.using(pool, MARIADB);
然后完全不使用所有资源进行尝试。这里的权衡是什么?有偶数吗

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

目前,我的代码执行以下操作:

try (final Connection cn = pool.getConnection()) {
    DSLContext dsl = DSL.using(cn, MARIADB);
    // query stuff
}
try (final Connection cn = pool.getConnection()) {
    DSLContext dsl = DSL.using(cn, MARIADB);
    // query stuff
}
这是正确的用法

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

这是一个正确的假设

然而,我确实收到IntelliJ的警告,说DSLContext是自动关闭的,应该通过资源试用来处理

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

,导致IDE中的此警告最好关闭(或者您可以指定异常)

你的问题: 用以下代码替换上述代码是否安全:

try (final DSLContext dsl = DSL.using(pool.getConnection(), MARIADB)) {
    // query stuff
}
try (final DSLContext dsl = DSL.using(pool.getConnection(), MARIADB)) {
  // query stuff
}
是的,你能做到。
DSLContext.close()
调用将仅关闭由
DSLContext
创建的资源。在你的情况下,它没有任何效果

为了记录在案,创建了资源丰富的DSL上下文,例如

然后完全不使用所有资源进行尝试。这里的权衡是什么?有偶数吗

所有这些实际上与资源无关

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

  • 关掉那个警告!:-)
  • 在调用时,查询可以是足智多谋的

  • 我要寻找的是能够满足这四个要求的代码

  • 它使用正确的资源管理
  • 它使用JOOQ
  • IDE中打开了“尝试使用资源”警告
  • 没有警告
  • 最重要的是,各种代码至少有一项不符合这些要求。但最终连接处理并不重要,因为JOOQ中的查询类也会生成大量警告

    最好的方法确实是关闭警告,但是对于JOOQ来说,特别是使用Intellij的排除规则。如何做到这一点在Lukas链接的页面上的评论中提到()


    我只需要记住对JOOQ类执行正确的操作:)

    “是的,您可以这样做。DSLContext.close()调用将只关闭由DSLContext创建的资源。”。这很令人困惑。如果DSLContext只关闭它创建的资源,那么答案应该是否定的?因为我自己从游泳池里抢走了连接,自己没有关上。因此,这段代码应该会导致资源泄漏。我不想关闭该警告的原因是,它确实可以帮助解决令人讨厌的小错误。我曾经写过的最大错误是没有关闭AWS sdk中的S3Object,因为我不知道需要关闭它。“如果DSLContext只关闭由它创建的资源,那么答案应该是否定的?”-你可以这样做,但不会有任何效果。尝试在任何Java8流上调用
    Stream.close()
    。我不认为这个jOOQ案例比Java8流更令人困惑。。。“因为我自己从游泳池中抓取了连接,而自己没有关闭它”,那么你应该关闭连接。“所以这段代码应该会导致资源泄漏”-是的,但不是你的jOOQ代码可以,而是你的连接池客户端代码可以!是的,我想需求和设计约束的结合并不能让我在这里得到想要的东西。我认为Java在描述Autoclosable契约时做了正确的事情,JOOQ在实现它时做了正确的事情,IntelliJ在提供警告时做了正确的事情。这只是设计约束的不幸组合。不能既吃蛋糕又吃蛋糕:)是的,可以,这就是我现在正在用的。我认为这是我能达到的所有要求中最接近的。这并不完美,因为我可能会不小心弄乱JOOQ代码,但由于我一直在编写代码,所以我并不太害怕。我把答案写在下面是为了给别人总结。