jooq 3.13资源泄漏

Hayami Pysh:

我检查了我的Java代码,覆盖率分析发现此资源泄漏错误。

@Before
public void init() {

(1) Event alloc_fn: A new resource is returned from allocation method "deleteFrom". (The virtual call resolves to "org.jooq.impl.DefaultDSLContext.deleteFrom".)
(2) Event leaked_resource:  Failing to save or close resource created by "dslContext.deleteFrom(com.nurego.bizops.metering.common.jooq.nongen.tables.MyTable.MYTABLE)" leaks it.

            dslContext.deleteFrom(MyTable.MYTABLE).execute();
}

dslContext.close() 已在前毁灭法中使用。

我应该这样吗?

DeleteUsingStep<MyTableRecord> step = dslContext.deleteFrom(MyTable.MYTABLE);
step.execute();
step.close();

还是有更好的解决方案?

卢卡斯·埃德(Lukas Eder):

Java 7和8之间在合同方面进行了微妙的更改AutoCloseable,请参阅Javadoc:

Java 7版本

在不再需要时必须关闭的资源。

注意单词“必须”。

Java 8版本

在关闭之前可以保存资源(例如文件或套接字句柄)的对象。当退出在资源规范头中已声明该对象的try-with-resources块时,将自动调用AutoCloseable对象的close()方法。这种构造可确保及时释放,避免资源耗尽异常和可能发生的错误。

API注意:

即使并非所有子类或实例都拥有可释放的资源,基类也有可能并且实际上是常见的。对于必须完全通用的代码,或者对于已知AutoCloseable实例需要释放资源的代码,建议使用try-with-resources构造。但是,当使用诸如Stream的工具同时支持基于I / O和基于非I / O的形式时,使用非基于I / O的形式时通常不需要使用资源尝试模块。

尽管实际上几乎所有流都不是资源丰富的事实,但这样做(可能)是为了方便使用Stream来扩展流。AutoCloseabletry-with-resources

不幸的是,这使大多数静态分析工具在自动关闭检测方面毫无用处。他们可能已经为流而不是硬编码了一个异常DSLContext

使用jOOQ时,您可以放心地忽略这些错误DSLContext

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章