【问题标题】:How to batch execute with JOOQ如何使用 JOOQ 批量执行
【发布时间】:2018-04-21 10:55:32
【问题描述】:

我正在使用 JOOQ 调用现有的 MySql 存储过程。我的代码是用 Java 编写的。一切都很好,但是在批量插入时我有点困惑。例如,我有这样的简单:

private void executeBatch(DSLContext context, LinkedList<AbstractRoutine<Void>> procedures) {
        BatchBindStep step = null;
        for (AbstractRoutine<Void> procedure : procedures) {
            step = context.batch (context.select(procedure.asField()));
        }

        step.execute();
    }

所提供的 LinkedList 中的每个过程都是一个更新或插入过程,具有自己的参数集,并且实际上已准备好执行。我只是想将它们绑定在一起进行批处理。

当我尝试执行上面的代码时,我得到了错误:

Caused by: java.sql.BatchUpdateException: Can not issue SELECT via executeUpdate().

我做错了什么?我应该解决什么问题?我试图在线搜索答案,但似乎使用 JOOQ 两个批处理存储过程调用并不那么受欢迎。我必须这样做以保持与我的 pre-JOOQ 应用程序的其余部分的兼容性....

【问题讨论】:

标签: java mysql stored-procedures jdbc jooq


【解决方案1】:

您的存储过程不得执行任何可以作为 Java 输出的结果,因为每个过程都是使用 executeUpdate 函数调用的。

来自 Java 文档

int executeUpdate(String sql) 抛出 SQLException

执行给定的 SQL 语句,可能是 INSERT, UPDATE,或 DELETE 语句或不返回任何内容的 SQL 语句, 例如 SQL DDL 语句。

【讨论】:

    【解决方案2】:

    As discussed on the user group,目前(从 jOOQ 3.10 开始)jOOQ 中没有对批处理存储过程的开箱即用支持。待处理的功能请求在这里: https://github.com/jOOQ/jOOQ/issues/6813

    解决方法

    针对您的特定用例有多种解决方法,包括:

    • 使用临时表并在其中加载数据/参数集。
    • 使用 jOOQ 的 batching APIdata loading API 将数据直接加载到目标表中
    • 如果您的数据库支持,则使用表值参数
    • 绕过 jOOQ 并诉诸普通 JDBC

    【讨论】:

      【解决方案3】:

      正如在上述 Google 小组中与 Lukas Eder 讨论的那样,此功能(批量调用存储过程)将添加到 JOOQ 3.11。

      【讨论】:

        猜你喜欢
        • 2020-11-02
        • 2016-11-22
        • 2014-10-06
        • 1970-01-01
        • 1970-01-01
        • 2018-02-10
        • 2012-03-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多