我创建了一个使用类型读者的工作
org.springframework.batch.item.database.HibernateCursorItemReader
执行查询。
问题是数据库连接在这种情况下是达到连接限制(我有一个oracle错误ORA-12519, TNS:no appropriate service handler found
),令人惊讶的是,我注意到exit_code=EXECUTING and status=STARTED on BATCH_STEP_EXECUTION table.
如果我再次运行该作业,它将回复"A job execution for this job is already running"
,如果我对此任务发出-restart
,则会发出错误消息"No failed or stopped execution found for job".
春季批次如何管理这些致命的失败情况?我是否必须手动删除这些执行信息或是否有重置选项? 感谢您的帮助
答案 0 :(得分:1)
Spring Batch(2.2.0)的当前版本似乎没有针对这种情况的开箱即用解决方案。正如本question中所讨论的那样,可能需要对数据库进行“手动”干预。或者,如果这是一个悬挂的特定工作(也就是说,您知道工作名称),您也可以执行以下操作;
JobExplorer.findRunningJobExecutions(jobName)
JobExecution.upgradeStatus(BatchStatus.FAILED)
)JobRepository.update(jobExecution)
答案 1 :(得分:0)
使用CursorItemReader(JDBCCursorItemReader或HibernateCursorItemReader)时,为什么会出现连接限制的问题?
即使已经为事务打开了连接(Reader - > Processors - > Writer),cursorItemReader也会打开一个单独的连接。因此,每个步骤执行都需要两个连接,即使它在单个事务中并且命中相同的数据库。这会导致连接瓶颈,因此db连接数应该是线程池中配置的线程数的两倍,以便并行执行这些步骤。 如果您提供与CursorReader的单独连接,也可以解决此问题。
JdbcPagingItemReader是ItemReader的另一个实现,它使用为事务打开的相同连接。