Spring Batch,事务和错误恢复

时间:2014-04-11 17:36:31

标签: spring jdbc transactions spring-batch spring-transactions

我的ItemWriter有一个交易问题(我认为......)。

简而言之,我实现了一个ItemWriter来在我的Oracle数据库中插入数据抛出JDBC(我基本上使用getSimpleJdbcTemplate()。batchUpdate(myQuery,myObjects))。 由于我的目标表有外键,当我的数据违反此约束时,batchUpdate会抛出异常。但是所有数据都被拒绝(包括正确的数据)所以我需要的是逐个插入每个项目以保留所有“正确”的项目,并处理另一个项目(例如,为每个项目放置一个特定的日志)不正确的项目)。

我尝试了各种各样的东西,但没有任何作用:

对于每种情况,我的ItemWriter实现ItemWriteListener来处理onWriteError(...)方法中的错误。我看到“主事务”此时尚未提交,所以我想尝试暂停此事务,打开一个新事件逐个插入每个项目,返回主事务并让Spring Batch执行回滚“主要”交易。

1 - 使用@Transactional
  • 我在我的Spring Context中将tx命名空间包含在用户tx:annotation-driven中
  • 我创建了一个方法“create”,包括:getJdbcTemplate()。update(sql,itemValues);插入一个唯一的项目
  • 我把它     @Transactional(propagation = Propagation.REQUIRED_NEW)注释
  • 我做了我的ItemWriter实现itemWriteListener,在onWriteError(...)中放入一个for循环,调用我的create方法

结果是:

    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...]


执行永远不会结束,它似乎在这里被阻止(没有错误信息,没有...)。如果我暂停,我总是得到用户中断......但我不明白为什么。我认为随着“主要”交易“暂停,我可以为每个项目获得一个新的插入,就是这样......但现实似乎有所不同。

2-使用TransactionTemplate对象

在这种情况下,我试过了:

  • 在我的onWriteError方法中定义一个事务模板(从我的spring上下文获取我的事务管理器)
  • 将PropagationBehavior设置为“requires new”。
  • 执行一个TransactionCallbackWithoutResult,它调用我之前定义的create方法

我得到的结果和以前一样。

3-使用Connection和PrepareStatement对象

由于我非常绝望(并且对事务不太熟悉......),我尝试使用基本的JDBC调用。要恢复它,在我的for循环中打开一个Connection,准备我的语句,执行语句,提交并关闭所有内容。 但我得到了同样的东西。
我可以看到其他人也面临同样的问题,但我找不到任何解决办法......所以,如果你认为你可以帮助我,那么请...

0 个答案:

没有答案