JDBC批处理更新问题
我对Java-JDBC API和Oracle数据库有一个稍微独特的要求。我将autoCommit设置为默认值,这对于Oracle是正确的,并且我使用的示例与此链接相似。
但是,当我添加说1000批次时,可以说每个批次都是插入的。并且让我们假设大约20条记录违反了一些约束,我希望其余的980条成为COMMITTED(并且以后对于使用任何其他连接的任何其他查询都可见)到数据库,并忽略20条记录。在上面的示例中,当一行违反任何事务时,即使我在catch块中提交,事务也只会提交直到第一次失败。
我知道只有在完全确定所有行都会经过且异常处理不是一个的情况下,才进行批处理更新,但是正计划修补现有数据库,因此某种“不良做法”是可以的:)任何代码示例都可以高度赞赏。
*
使用简单插入/更新是不可行的,因为我正在处理接近3M的行,因此每1000条记录都会进行批处理。简单地在循环中添加1000个插入(忽略异常)会花费更多的时间(每1000条记录约5秒),而不是批量更新<300ms。
问题:对于Oracle数据库,驱动程序似乎在第一次失败时停止,即,当批量处理1000行而第100行失败时,我希望它继续到第1000行。我认为这无法在JDBC(使用Oracle)中完成,就像该链接表明只有很少的数据库支持这种功能,而Oracle可能不是一个
回答:
我正在寻找以下解决方案:“对于Oracle数据库,驱动程序似乎在第一次失败时就停止了,即,当批处理1000行而第100行失败时,我希望它继续到第1000行。” 基本上,我想知道是否可以使用Oracle JDBC驱动程序来完成。
但是,已经提出了各种各样的答案(我已经考虑过大部分/全部)1)禁用约束/加载数据/删除有问题的行/重复多次2)在加载数据之前进行所有检查3)减少批处理大小为50-100。
不幸的是,我无法在加载并使批次大小为50或100之前进行检查,这意味着要花更多的时间来处理我拥有的5M行(实际上,总时间增加到几个小时,而不是批次大小为1000的40分钟)。我采取的措施是使批次大小保持为1000,并按原样接受问题,并将代码置于“ while”循环下,然后进行操作,直到我们填满所有行。
就像我说的那样,由于ORACLE BATCH JDBC在第一次失败后就无法继续进行,因此此问题的答案将是“ NOT DOABLE”,并且仅接受约束条件并记录该工具大约需要40分钟才能完成的事实:)
以上是 JDBC批处理更新问题 的全部内容, 来源链接: utcz.com/qa/413949.html