我检查了我的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();
还是有更好的解决方案?
Java 7和8之间在合同方面进行了微妙的更改AutoCloseable
,请参阅Javadoc:
在不再需要时必须关闭的资源。
注意单词“必须”。
在关闭之前可以保存资源(例如文件或套接字句柄)的对象。当退出在资源规范头中已声明该对象的try-with-resources块时,将自动调用AutoCloseable对象的close()方法。这种构造可确保及时释放,避免资源耗尽异常和可能发生的错误。
API注意:
即使并非所有子类或实例都拥有可释放的资源,基类也有可能并且实际上是常见的。对于必须完全通用的代码,或者对于已知AutoCloseable实例需要释放资源的代码,建议使用try-with-resources构造。但是,当使用诸如Stream的工具同时支持基于I / O和基于非I / O的形式时,使用非基于I / O的形式时通常不需要使用资源尝试模块。
尽管实际上几乎所有流都不是资源丰富的事实,但这样做(可能)是为了方便使用Stream
来扩展流。AutoCloseable
try-with-resources
不幸的是,这使大多数静态分析工具在自动关闭检测方面毫无用处。他们可能已经为流而不是硬编码了一个异常DSLContext
。
使用jOOQ时,您可以放心地忽略这些错误DSLContext
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句