适用于以下版本: Dev (3.21) | 最新版本 (3.20) | 3.19 | 3.18 | 3.17 | 3.16 | 3.15 | 3.14 | 3.13 | 3.12 | 3.11

重用查询的 PreparedStatement

适用于 ✅ 开源版   ✅ 专业版   ✅ 企业版

正如之前在关于 jOOQ 和 JDBC 之间的差异 一章中讨论的,在 jOOQ 中重用 PreparedStatements 的处理方式与 JDBC 中略有不同。

使用 JDBC 保持 PreparedStatement 打开

使用 JDBC,您可以通过在后续执行之间不关闭 java.sql.PreparedStatement 来轻松重用它。 这里给出一个例子

// Execute the statement
try (PreparedStatement stmt = connection.prepareStatement("SELECT 1 FROM DUAL")) {

    // Fetch a first ResultSet
    try (ResultSet rs1 = stmt.executeQuery()) { ... }

    // Without closing the statement, execute it again to fetch another ResultSet
    try (ResultSet rs2 = stmt.executeQuery()) { ... }
}

当您想要重用昂贵的数据库资源时,上述技术非常有用。 当您的语句执行非常频繁,并且您的数据库需要花费相当长的时间来软解析预编译语句并生成新的语句/游标资源时,就会发生这种情况。

使用 jOOQ 保持 PreparedStatement 打开

jOOQ 中也对此进行了建模。 但是,与 JDBC 的区别在于,关闭语句是默认操作,而保持语句打开必须显式配置。 这比 JDBC 更好,因为默认操作应该是最常用的操作。 在普通应用程序中很少保持语句打开。 下面是一个如何在 jOOQ 中保持 PreparedStatement 打开的例子

// Create a query which is configured to keep its underlying PreparedStatement open
try (ResultQuery<Record> query = create.selectOne().keepStatement(true)) {
    Result<Record> result1 = query.fetch(); // This will lazily create a new PreparedStatement
    Result<Record> result2 = query.fetch(); // This will reuse the previous PreparedStatement
}

上面的例子展示了如何针对同一个底层 java.sql.PreparedStatement 执行两次查询。 请注意,现在必须像资源一样对待 Query,即必须在 try-with-resources 语句中管理它,或者必须显式调用 Query.close()

反馈

您对此页面有任何反馈吗? 我们很乐意听到您的反馈!

The jOOQ Logo