我的ItemWriter有一个交易问题(我认为......)。
简而言之,我实现了一个ItemWriter来在我的Oracle数据库中插入数据抛出JDBC(我基本上使用getSimpleJdbcTemplate()。batchUpdate(myQuery,myObjects))。 由于我的目标表有外键,当我的数据违反此约束时,batchUpdate会抛出异常。但是所有数据都被拒绝(包括正确的数据)所以我需要的是逐个插入每个项目以保留所有“正确”的项目,并处理另一个项目(例如,为每个项目放置一个特定的日志)不正确的项目)。
我尝试了各种各样的东西,但没有任何作用:
对于每种情况,我的ItemWriter实现ItemWriteListener来处理onWriteError(...)方法中的错误。我看到“主事务”此时尚未提交,所以我想尝试暂停此事务,打开一个新事件逐个插入每个项目,返回主事务并让Spring Batch执行回滚“主要”交易。
1 - 使用@Transactional结果是:
DataSourceTransactionManager:415 - Suspending current transaction, creating new transaction with name [null]
DataSourceTransactionManager:204 - Acquired Connection
[jdbc:oracle:thin:@localhost:1521:EP, UserName=A1_USER, Oracle JDBC driver] for JDBC transaction
JdbcTemplate:810 - Executing prepared SQL update
JdbcTemplate:569 - Executing prepared SQL statement [SQL query...]
执行永远不会结束,它似乎在这里被阻止(没有错误信息,没有...)。如果我暂停,我总是得到用户中断......但我不明白为什么。我认为随着“主要”交易“暂停,我可以为每个项目获得一个新的插入,就是这样......但现实似乎有所不同。
在这种情况下,我试过了:
我得到的结果和以前一样。
3-使用Connection和PrepareStatement对象由于我非常绝望(并且对事务不太熟悉......),我尝试使用基本的JDBC调用。要恢复它,在我的for循环中打开一个Connection,准备我的语句,执行语句,提交并关闭所有内容。
但我得到了同样的东西。
我可以看到其他人也面临同样的问题,但我找不到任何解决办法......所以,如果你认为你可以帮助我,那么请...