Java 发现重复密钥时丢失剩余的批处理SQL查询
有人能建议我如何将批处理查询插入到ApacheDerby数据库中,同时仍能以良好的性能处理重复条目吗 为了在性能和插入时处理重复键的能力之间取得平衡,我决定让JDBC/Derby告诉我批处理查询何时会导致重复键,捕获错误,然后继续其余的批处理查询 不幸的是,一旦检测到错误,它似乎会清除整批查询,这意味着我将丢失所有剩余的记录 我尝试过的事情:Java 发现重复密钥时丢失剩余的批处理SQL查询,java,sql,database,jdbc,derby,Java,Sql,Database,Jdbc,Derby,有人能建议我如何将批处理查询插入到ApacheDerby数据库中,同时仍能以良好的性能处理重复条目吗 为了在性能和插入时处理重复键的能力之间取得平衡,我决定让JDBC/Derby告诉我批处理查询何时会导致重复键,捕获错误,然后继续其余的批处理查询 不幸的是,一旦检测到错误,它似乎会清除整批查询,这意味着我将丢失所有剩余的记录 我尝试过的事情: 执行编程查询以确定条目是否已在其中。放弃此操作,因为数据当前可能在一个批中,因此将丢失 使用SQL查询仅在记录不存在时插入。放弃此选项是因为它导致了糟糕
- 执行编程查询以确定条目是否已在其中。放弃此操作,因为数据当前可能在一个批中,因此将丢失
- 使用SQL查询仅在记录不存在时插入。放弃此选项是因为它导致了糟糕的插入性能(下降了近70%)
- 让数据库告诉我有关重复密钥的信息,捕获错误并继续批处理。即将放弃此操作,因为它“忘记”批处理中还有其他查询要处理李>
INSERT IGNORE
,您只需使用Derby支持的MERGE
。JDBC允许驱动程序在错误发生后继续执行批处理语句:
如果批处理更新中的某个命令无法正确执行,
此方法抛出一个BatchUpdateException,JDBC驱动程序可以或
不能继续处理批处理中的其余命令
现在,derby记录了在嵌入式模式下,如果遇到错误,批处理将停止,而网络驱动程序将继续:
处理批处理过程中遇到的错误情况
java.sql.Statement、java.sql.PreparedStatement和
java.sql.CallableStatement则不同。使用嵌入式驱动程序
遇到错误时,处理停止;使用网络客户端
驱动程序处理将继续进行,但将使用中定义的适当值
在结果更新计数中返回java.sql.Statement api
数组
但是,如果您想执行
插入忽略
,您只需使用Derby支持的合并
。您是在嵌入式模式下运行Derby还是作为网络服务器运行?它是在嵌入式模式下运行的。它只有一个用户,即应用程序。它是一个轻量级的临时数据库。您是在嵌入式模式下运行derby还是作为网络服务器运行derby?它是在嵌入式模式下运行的。它只有一个用户,即应用程序。这是一个轻量级的临时数据库Hi@Wero,感谢您的回复。您是否建议我可以在网络模式下运行应用程序并在本地主机上连接?我查看了merge
,但它似乎不支持我的用例,因为它需要一个源表。在我的两个表中,我从应用程序数据插入,然后在我的查找表中,我根据其他两个表中的行插入。@jdie8274j您可以尝试网络模式,看看它是否有效。难道(从dual中选择as id)
不能作为源表工作吗?不幸的是,我认为Derby不支持dual
!我还试图避免SELECT
查询,因为我插入了大量数据,而且我想快速完成。因此,当我发现仅仅捕获一个重复的密钥异常是不起作用的时候,我很失望@jdie8274j有趣的是,在derbydual
中是sysibm.sysdummy1
,嗯@wero,您的合并
想法对于这两个表来说看起来不错。性能也很好。你知道我如何使用另外两个id将insert合并到查找表中吗?您好@Wero,谢谢您的回复。您是否建议我可以在网络模式下运行应用程序并在本地主机上连接?我查看了merge
,但它似乎不支持我的用例,因为它需要一个源表。在我的两个表中,我从应用程序数据插入,然后在我的查找表中,我根据其他两个表中的行插入。@jdie8274j您可以尝试网络模式,看看它是否有效。难道(从dual中选择as id)
不能作为源表工作吗?不幸的是,我认为Derby不支持dual
!我还试图避免SELECT
查询,因为我插入了大量数据,而且我想快速完成。因此,当我发现仅仅捕获一个重复的密钥异常是不起作用的时候,我很失望@jdie8274j有趣的是,在derbydual
中是sysibm.sysdummy1
,嗯@wero,您的合并
想法对于这两个表来说看起来不错。性能也很好。你知道如何使用另外两个id将insert合并到查找表中吗?