【问题标题】:jooq 3.13 resource leakjooq 3.13 资源泄漏
【发布时间】:2020-12-09 15:55:10
【问题描述】:

我检查了我的 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 database jooq


    【解决方案1】:

    直到 jOOQ 3.13

    There was a subtle change in contract between Java 7 and 8 regarding AutoCloseable,参见 Javadoc:

    Java 7 version

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

    注意“必须”这个词。

    Java 8 version

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

    API 说明:

    基类有可能实现 AutoCloseable,而且实际上很常见,即使并非所有子类或实例都拥有可释放资源。对于必须完全通用运行的代码,或者当已知 AutoCloseable 实例需要资源释放时,建议使用 try-with-resources 构造。但是,当使用支持基于 I/O 和非基于 I/O 的表单的 Stream 等设施时,在使用非基于 I/O 的表单时通常不需要 try-with-resources 块。

    这样做(可能)是为了允许 Stream 扩展 AutoCloseable 以便于使用带有 try-with-resources 的流,尽管事实上几乎所有流都不是资源丰富的。​​

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

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

    从 jOOQ 3.14 开始

    这一直是 jOOQ 新用户经常遇到的问题,并且可能被视为 API 设计缺陷。 jOOQ 3.14 将从 DSLContext 超类型中删除 AutoCloseable 类型,并提供专用的 CloseableDSLContext 代替,它仅从相关方法返回: https://github.com/jOOQ/jOOQ/issues/10512

    【讨论】:

      【解决方案2】:

      你可以试试这个:

      try( DeleteUsingStep<MyTableRecord> step = dslContext.deleteFrom(MyTable.MYTABLE)) {
          step.execute();
      } 
      

      原因可能是step 继承了org.jooq.Query,即AutoCloseable

      【讨论】:

        猜你喜欢
        • 2014-02-10
        • 1970-01-01
        • 1970-01-01
        • 2012-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-15
        • 2010-10-29
        相关资源
        最近更新 更多