找到重复键时丢失剩余的批处理SQL查询

时间:2016-04-22 08:19:18

标签: java sql database jdbc derby

有人可以建议我如何将批处理查询插入到Apache Derby DB中,同时仍处理具有良好性能的重复条目吗?

作为尝试和平衡性能以及在INSERT上处理重复键的能力的最后手段,我决定让JDBC / Derby告诉我何时批处理查询会导致重复键,捕获错误,然后继续剩下的批量查询。

不幸的是,一旦检测到错误,它似乎就会清除整批查询,这意味着我将丢失所有剩余的记录。

我尝试的事情:

  • 执行编程查询以确定条目是否已存在。遗弃了这一点,因为数据目前可能是批量生产的,因此将被遗漏。
  • 如果记录不存在,则使用SQL查询仅INSERT 。遗弃了这个因为它导致了糟糕的INSERT性能(下降了近70%)。
  • 让DB告诉我重复键,捕获错误并继续处理批处理。即将放弃,因为它会忘记'批处理中还有其他要处理的查询。

如果只有Derby支持INSERT IGNORE。

由于

1 个答案:

答案 0 :(得分:3)

驱动程序在发生错误后可以继续执行批处理语句的JDBC says

  

如果批量更新中的某个命令无法正确执行,   此方法抛出BatchUpdateException,JDBC驱动程序可能或   可能无法继续处理批处理中的其余命令。

现在,如果遇到错误,嵌入模式批处理中的derby docs state会停止,而网络驱动程序会继续:

  

处理批处理期间遇到的错误情况   java.sql.Statement,java.sql.PreparedStatement和   java.sql.CallableStatement是不同的。使用嵌入式驱动程序   遇到错误时处理停止;使用网络客户端   驱动程序处理继续,但是在中定义了适当的值   在生成的更新计数中返回java.sql.Statement api   阵列。

但是考虑到您想要执行INSERT IGNORE,您只需使用Derby支持的MERGE statement