Spring JDBC:120秒后出现Oracle事务错误

时间:2016-02-12 08:00:08

标签: spring-mvc oracle11g spring-data

对于特定要求,我将不得不遍历50000条记录的列表并将它们插入到数据库中。要求是,如果50000条记录中的任何一条记录失败,则所有其他记录都应该回滚。因此我们没有涉及处理中的任何提交。但是这导致了以下错误:

  

[2/1/16 14:01:47:939 CST] 000000be SystemOut O ERROR   org.springframework.jdbc.UncategorizedSQLException:   PreparedStatementCallback;未分类SQL的SQLException [INSERT   INTO ...)VALUES(...)]; SQL状态[null];错误代码[0];当前   线程在超过[120]秒内未提交并可能发生   不必要的阻塞锁。请重构代码以提交更多内容   频繁。

现在,当我们实现批处理时 - 我们使用PreparedStatement.executeBatch()方法以100个批量插入数据,上述错误不会出现。对于批处理,autoCommit默认设置为true,因此每次批处理后都会发生提交。

在上述情况下,有人可以建议我们如何处理回滚机制。如果第50批次执行失败,那么我们希望还原所有之前的49个批处理执行。我们使用的是Spring Data / JDBC,Oracle 11g数据库,WebSphere应用服务器。我已经在某处读过,也可以在WebSphere的JTA设置中配置上面120秒的提交超时。是这样吗?请提出任何替代方案或其他可能的解决方案。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

您必须将autocommit设置为false,并且只有在所有批次成功执行后才提交。