使用Groovy批处理异构SQL预处理语句?

时间:2013-11-13 19:14:55

标签: sql groovy batch-processing

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

2 个答案:

答案 0 :(得分:1)

Oracle's documentation中所述:

  

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

     

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

IBM's documentation中所述并摘自here

  

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

     

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

这意味着您无法提出申请。您可以获得的唯一优势是批量处理相同类型的语句并仅准备一次的性能改进:

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

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

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

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

由于只在节省时间后才进行准备。

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

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

BTW,编译的是什么

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

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

答案 1 :(得分:1)

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