【问题标题】:Losing remaining batched SQL queries when duplicate key found发现重复键时丢失剩余的批处理 SQL 查询
【发布时间】:2016-04-22 08:19:18
【问题描述】:

谁能建议我如何将批量查询插入到 Apache Derby 数据库中,同时仍能以良好的性能处理重复条目?

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

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

我尝试过的事情:

  • 执行程序查询以确定条目是否已经存在。放弃了这个,因为数据当前可能是批量的,所以会丢失。
  • 仅当记录不存在时才使用 SQL 查询插入。放弃了这个,因为它导致了糟糕的 INSERT 性能(下降了近 70%)。
  • 让数据库告诉我有关重复键的信息,捕获错误并继续处理批处理。即将放弃这一点,因为它“忘记”批处理中还有其他查询要处理。

如果只有 Derby 支持 INSERT IGNORE。

谢谢

【问题讨论】:

  • 您是在嵌入式模式下运行 derby 还是作为网络服务器运行?
  • 它以嵌入式模式运行。它只有一个用户——即应用程序。它是一个轻量级的临时数据库

标签: java sql database jdbc derby


【解决方案1】:

JDBCsays,它是一个驱动可能在出错后继续执行批处理语句:

如果批量更新中的某个命令未能正确执行, 此方法会引发 BatchUpdateException,并且 JDBC 驱动程序可能会或 可能不会继续处理批处理中的剩余命令。

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

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

但鉴于您想要执行 INSERT IGNORE,您可以简单地使用 Derby 支持的 MERGE statement

【讨论】:

  • 嗨@Wero,感谢您的回复。您是否建议我可以在网络模式下运行应用程序并在 localhost 上连接?我查看了merge,但它似乎不支持我的用例,因为它需要一个源表。在我的两个表中,我从应用程序数据中插入,然后在我的查找表中,我根据其他两个中的行进行插入。
  • @jdie8274j 你可以试试网络模式,看看它是否有效。 (SELECT <id> as id FROM dual) 不会作为源表工作吗?
  • 我不认为dual 得到 Derby 的支持!我还试图避免SELECT 查询,因为我要插入大量数据,并且我想快速完成。因此,当我发现简单地捕获重复键异常不起作用时,我感到很失望!
  • @jdie8274j 有趣,在德比中dualsysibm.sysdummy1, stackoverflow.com/questions/20262352/…
  • 好吧@wero,你的merge 想法看起来很适合这两张桌子。表现也非常好。您知道如何使用其他两个的 id 将 merge insert 放入查找表吗?
猜你喜欢
  • 2013-05-10
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
  • 2016-04-16
相关资源
最近更新 更多