我使用Spring Batch 3.0.7,EclipseLink 2.6.4和Oracle 11/12。Spring批处理器没有看到更新的数据
我在数据库中有一对多的关系。批处理读取器读取处理器读取多边(子)的一边(父)。 我很确定这两个都是由不同的应用程序事务插入的。
批处理读取器来自JdbcCursorItemReader
,只是设置了rowMapper
和preparedStatementSetter
。
处理器是使用Spring Data JpaRepository的ItemProcessor
并将数据添加到父级。 资源库有@Transactional(readOnly = true)
。
阅读器似乎总是使用相同的数据库会话,并且处理器始终使用不同的数据库会话。
有了这个设置,我不时得到一个ORA-01555
(快照太旧)错误。 但是还有一个更大的问题: 如果在作业运行之间存在新的父子数据,则阅读器找到父代,但处理器没有看到任何子代。 只有第一个父/子插入工作(以某种方式,处理器停留在Oracle数据的修复快照上)。
我已经做了什么来解决这个问题:每个作业运行我都要关闭Spring Context,然后重新创建它。 这解决了这两个问题(ORA-01555
错误和处理器没有看到更新的数据)。
重新创建Spring上下文的目的是获取新的数据库会话。我不知道这样做的更简单的方法。
我认为不应该有必要重新创建上下文,但我找不到这种行为的原因。
UPDATE: 在这里你可以找到的代码 https://github.com/th-e/SpringBatchDataPump
添加一些代码和配置没有它的问题是很难看到的。关闭并重新创建环境也是一个坏主意。 –
重新创建上下文只是为了尽快修复。但有趣的是,它解决了这两个问题。更多细节即将到来...... –