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