【问题标题】:How does the fetchNext(int) method works in jooq?fetchNext(int) 方法在 jooq 中是如何工作的?
【发布时间】:2019-09-11 01:11:40
【问题描述】:

来自 fetchNext(int number) 的文档 - “这将在获取最后一条记录后方便地关闭光标。”

假设 number=100,总共有 1000 条记录。 一旦获取第 100 条记录,或者获取第 1000 条记录,它会关闭游标吗? 换句话说,文档中提到的“最后一条记录”是什么?

Cursor<Record> records = dsl.select...fetchLazy();

while (records.hasNext()) {
   records.fetchNext(100).formatCSV(out);
}
out.close();

【问题讨论】:

    标签: jooq


    【解决方案1】:

    这种便利是 jOOQ 中的一个历史特性,最终将被删除:https://github.com/jOOQ/jOOQ/issues/8884。与 Java 中的每个 Closeable 资源一样,您应该永远依赖这种自动关闭。当你知道你已经使用完资源时,最好立即关闭它。在您的情况下,理想情况下,将代码包装在 try-with-resources 语句中。

    Javadoc 的意思是,一旦 jOOQ 对 ResultSet.next() 的调用产生 false,底层 JDBC ResultSet 就会关闭,即数据库不再返回记录。所以不行。如果您的选择总共有 1000 条记录,而您只获取 100 条,那么游标将不会关闭。如果是这样,这将不是一个“便利功能”,而是会破坏各种其他 API,包括您调用的 API。完全可以调用fetchNext(100) 两次,或者像你一样循环调用。

    【讨论】:

    • 谢谢,我们确实希望它只有在获取所有记录的最后一条后才会关闭(hasNext==false)。我问是因为最近我们遇到了性能下降,在某些情况下甚至是部分结果,因为我们已经从在每个 DB 调用上重新创建 DSLContext 转变为创建一次并重用它。请在上面的 EDIT 中找到代码示例。
    • @Hagai:感谢您的更新。我不确定这是否相关。您介意恢复您的编辑并提出一个新问题吗?如果这两个问题分开,未来的访问者可能会发现它更有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 2013-10-25
    • 1970-01-01
    相关资源
    最近更新 更多