4

使用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没有该签名。)

4

2 回答 2

1

Oracle 文档中所述:

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

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

IBM 文档中所述并取自此处

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

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

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

当您执行单个 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 驱动程序根本不会使用批处理。

于 2013-11-25T16:49:44.093 回答
1

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

于 2013-11-30T01:49:54.440 回答