Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 发现重复密钥时丢失剩余的批处理SQL查询_Java_Sql_Database_Jdbc_Derby - Fatal编程技术网

Java 发现重复密钥时丢失剩余的批处理SQL查询

Java 发现重复密钥时丢失剩余的批处理SQL查询,java,sql,database,jdbc,derby,Java,Sql,Database,Jdbc,Derby,有人能建议我如何将批处理查询插入到ApacheDerby数据库中,同时仍能以良好的性能处理重复条目吗 为了在性能和插入时处理重复键的能力之间取得平衡,我决定让JDBC/Derby告诉我批处理查询何时会导致重复键,捕获错误,然后继续其余的批处理查询 不幸的是,一旦检测到错误,它似乎会清除整批查询,这意味着我将丢失所有剩余的记录 我尝试过的事情: 执行编程查询以确定条目是否已在其中。放弃此操作,因为数据当前可能在一个批中,因此将丢失 使用SQL查询仅在记录不存在时插入。放弃此选项是因为它导致了糟糕

有人能建议我如何将批处理查询插入到ApacheDerby数据库中,同时仍能以良好的性能处理重复条目吗

为了在性能和插入时处理重复键的能力之间取得平衡,我决定让JDBC/Derby告诉我批处理查询何时会导致重复键,捕获错误,然后继续其余的批处理查询

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

我尝试过的事情:

  • 执行编程查询以确定条目是否已在其中。放弃此操作,因为数据当前可能在一个批中,因此将丢失
  • 使用SQL查询仅在记录不存在时插入。放弃此选项是因为它导致了糟糕的插入性能(下降了近70%)
  • 让数据库告诉我有关重复密钥的信息,捕获错误并继续批处理。即将放弃此操作,因为它“忘记”批处理中还有其他查询要处理
如果只有Derby支持插入忽略

感谢JDBC允许驱动程序在发生错误后继续执行批处理语句:

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

现在,derby记录了在嵌入式模式下,如果遇到错误,批处理将停止,而网络驱动程序将继续:

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

但是,如果您想执行
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有趣的是,在derby
dual
中是
sysibm.sysdummy1
,嗯@wero,您的
合并
想法对于这两个表来说看起来不错。性能也很好。你知道我如何使用另外两个id将insert合并到查找表中吗?您好@Wero,谢谢您的回复。您是否建议我可以在网络模式下运行应用程序并在本地主机上连接?我查看了
merge
,但它似乎不支持我的用例,因为它需要一个源表。在我的两个表中,我从应用程序数据插入,然后在我的查找表中,我根据其他两个表中的行插入。@jdie8274j您可以尝试网络模式,看看它是否有效。难道
(从dual中选择as id)
不能作为源表工作吗?不幸的是,我认为Derby不支持
dual
!我还试图避免
SELECT
查询,因为我插入了大量数据,而且我想快速完成。因此,当我发现仅仅捕获一个重复的密钥异常是不起作用的时候,我很失望@jdie8274j有趣的是,在derby
dual
中是
sysibm.sysdummy1
,嗯@wero,您的
合并
想法对于这两个表来说看起来不错。性能也很好。你知道如何使用另外两个id将insert合并到查找表中吗?