【问题标题】:Batching heterogeneous SQL prepared statements with Groovy?使用 Groovy 批处理异构 SQL 准备语句?
【发布时间】:2013-11-26 13:31:29
【问题描述】:

Batch insert using groovy Sql? 讨论如何批量执行多个准备好的语句。但所有语句必须具有相同的结构(作为顶级参数传入withBatch)。

有没有办法批量处理异构的预处理语句,例如:

sql.withBatch {ps ->
    ps.addBatch("insert into t1 values(:a, :b)", [a:1, b:2])
    ps.addBatch("insert into t2 values(:c)", [c:3])
}

(这会引发异常,因为addBatch 没有该签名。)

【问题讨论】:

    标签: sql groovy batch-processing


    【解决方案1】:

    Oracle's documentation中所述:

    准备好的陈述: 使用不同的绑定变量重复相同的语句。

    批量更新: 您可以通过将多个 UPDATE、DELETE 或 INSERT 语句分组到一个批处理中并将整个批处理发送到数据库并一次处理来减少到数据库的往返次数,从而提高应用程序性能。这在与准备好的语句结合使用时特别有用。

    IBM's documentation 中所述并取自here

    支持 JDBC 2.0 及以上版本的 JDBC 驱动支持批处理 更新。使用批量更新,而不是更新 DB2(R) 的行 一次一张表,可以直接 JDBC 执行一组更新 同时。可以包含在同一批次中的语句 更新被称为批处理语句。

    如果语句有输入参数或宿主表达式,你可以 仅将该语句包含在具有其他实例的批处理中 同样的声明。这种类型的批次称为均质批次。如果 语句没有输入参数,您可以将该语句包含在 仅当批处理中的其他语句没有输入时才批处理 参数或主机表达式。这种类型的批次被称为 异构批次。可以包含在同一个语句中的两个语句 批次被称为批次兼容。

    这意味着您的请求是不可能的。您可以获得的唯一优势是批处理相同类型的语句并且只准备一次的性能改进:

    当您执行单个 SQL 语句时,数据库会执行以下操作:

    • 准备声明
    • 绑定参数
    • 执行语句

    当您使用批处理命令时,会发生以下情况:

    • 准备声明(全部在一次传输中收到)
    • 对于以下所有具有不同参数的相同语句
      • 绑定参数
      • 执行语句

    因为准备工作只进行一次,节省时间。

    但您可以对命令进行排序和拆分:

    sql.withBatch(20, "insert into t1 values(:a, :b)") {
        ...
    }
    sql.withBatch(20, "insert into t2 values(:c)") {
        ...
    }
    

    顺便说一句,将编译的是

    sql.withBatch {ps ->
        ps.addBatch("insert into t1 values(1, 2)")
        ps.addBatch("insert into t2 values(3)")
    }
    

    但在这种情况下,我很好奇会发生什么:我希望 JDBC 驱动程序根本不会使用批处理。

    【讨论】:

      【解决方案2】:

      对于此示例,请考虑为您的数据库 (docs) 编写一个存储过程,该过程接受三个参数并插入两个记录。您的应用程序可以使用单个准备好的语句调用该过程,并且可以批处理该语句。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-27
        • 1970-01-01
        • 2010-11-18
        • 1970-01-01
        • 2015-06-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多