JDBC批量更新问题

时间:2009-05-29 08:33:29

标签: java jdbc batch-file

我对Java-JDBC API和Oracle数据库有一点点独特的要求。我有autoCommit默认为Oracle,我使用的示例与link类似。

然而,当我添加说1000个批次时,让我们说每个都是插入。让我们假设大约有20条记录违反了某些约束条件,我希望剩下的980条记录对数据库进行COMMITTED(以后对任何其他连接的任何其他查询都可见)并忽略20条记录。在上面的示例中,当一行违反任何事务时,即使我在catch块中提交,事务也只会提交直到第一次失败

我知道批量更新只有在您确定所有行都会通过并且异常处理不是一个时才会完成,但我打算修补现有数据库,以便某种“不良做法”可以接受:)代码示例将受到高度赞赏。

****更多细节****

使用简单的插入/更新是不行的,因为我处理接近3M行,所以每1000条记录批处理。简单地在循环中添加1000个插入(忽略异常)会占用更多时间(每1000个记录大约5秒),而不是批量更新< 300毫秒。

问题: 对于Oracle数据库,驱动程序似乎在第一次失败时停止,即当1000行被批处理并且第100次失败时,我希望它继续到第1000行。我认为这不能在JDBC中完成(使用Oracle)就像link表示只有少数数据库支持这样的功能,可能Oracle不是一个

7 个答案:

答案 0 :(得分:3)

您可以使用SAVE EXCEPTIONS子句使用PL / SQL存储过程,该子句允许您发出批量更新,然后返回无法更新的行。以下是几个示例链接:

http://rwijk.blogspot.com/2007/11/save-exceptions.html

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:8912264456901

答案 1 :(得分:2)

您应该插入到没有约束的工作表中,然后删除或修复违反的内容,并将其余部分INSERT SELECT到单个SQL语句中的实际表中。

答案 2 :(得分:1)

您可以尝试这样:从50或100批次开始。(选择一个大小,以便它们具有良好的概率,以便成功处理)。那些失败的,一个一个地处理。

其他可能性:禁用约束,加载数据,删除那些违反约束的行。

答案 3 :(得分:1)

我应首先检查是否存在约束违规,而不是在违反约束条件时插入该记录。

答案 4 :(得分:1)

我正在寻找一些解决方案“使用Oracle数据库驱动程序似乎在第一次失败时停止,即当1000行被批处理并且第100次失败时,我希望它继续直到第1000行。”基本上我想知道是否可以使用Oracle JDBC驱动程序完成此操作。

然而,已经提出了各种答案(我已经考虑过的大部分/全部答案) 1)禁用约束/加载数据/删除有问题的行/重复多次 2)在加载数据之前进行所有检查 3)将批量减小到50-100。

不幸的是,我的检查无法在加载之前完成并且批量大小为50或100意味着花费更多时间来完成我所拥有的5M行(事实上总时间增加到几个小时而不是40分钟,批量大小为1000)。我已经采取保持批量大小为1000 接受问题并将代码放在“while”循环下并完成工作直到我们填满所有行。

就像我说的那样,因为在第一次失败后有没有使用ORACLE BATCH JDBC 的方法,所以这个问题的答案将是“不可行”并且只接受约束并记录这样的事实:这个工具需要大约40分钟才能完成:)

答案 5 :(得分:1)

您可以尝试Oracle merge-when-not-matched语句吗?示例:http://www.idevelopment.info/data/Oracle/DBA_tips/SQL/SQL_14.shtml

答案 6 :(得分:0)

有一个例外表,并确保你的proc永远不会引发异常,但会保存数据库中的所有异常。完成所有操作后,查询异常表并查看记录无法通过。