Java spring批处理仍在执行中
我创建了一个使用Java spring批处理仍在执行中,java,spring,spring-batch,Java,Spring,Spring Batch,我创建了一个使用 org.springframework.batch.item.database.HibernateCursorItemReader执行查询 问题是在这种情况下,数据库连接达到了连接限制(我有一个oracle错误ORA-12519,TNS:没有找到合适的服务处理程序),令人惊讶的是,我注意到批处理步骤执行表上的exit\u code=EXECUTING和status=STARTED. 如果我再次运行作业,它将响应“此作业的作业执行已在运行”,如果我对此任务发出-restart,它
org.springframework.batch.item.database.HibernateCursorItemReader
执行查询
问题是在这种情况下,数据库连接达到了连接限制(我有一个oracle错误ORA-12519,TNS:没有找到合适的服务处理程序),令人惊讶的是,我注意到批处理步骤执行表上的exit\u code=EXECUTING和status=STARTED.
如果我再次运行作业,它将响应“此作业的作业执行已在运行”
,如果我对此任务发出-restart
,它将发出消息“未找到作业的失败或停止执行”。
spring batch如何管理这些致命的故障情况?我必须手动删除这些执行信息,还是有重置选项?
感谢您的帮助当前版本的Spring Batch(2.2.0)似乎没有针对这种情况的现成解决方案。如本节所述,可能需要对数据库进行“手动”干预。或者,如果这是挂起的特定作业(即,您知道作业名称),您也可以执行以下操作:
- 使用
JobExplorer.findRunningJobExecutions(jobName)
- 浏览执行列表并“失败”它们(
jobsecution.upgradeStatus(BatchStatus.FAILED)
)
- 使用
JobRepository.update(作业执行)
当前版本的Spring Batch(2.2.0)似乎没有针对这种情况的现成解决方案。如本节所述,可能需要对数据库进行“手动”干预。或者,如果这是挂起的特定作业(即,您知道作业名称),您也可以执行以下操作:
- 使用
JobExplorer.findRunningJobExecutions(jobName)
- 浏览执行列表并“失败”它们(
jobsecution.upgradeStatus(BatchStatus.FAILED)
)
- 使用
JobRepository.update(作业执行)
仅供参考,为什么在使用CursorItemReader(JDBCCursorItemReader或HibernateCursorItemReader)时会出现连接限制问题
即使已经为事务打开了连接(读卡器->处理器->写入器),cursorItemReader也会打开一个单独的连接。因此,每个步骤的执行都需要两个连接,即使它在单个事务中,并且访问相同的数据库。这会导致连接瓶颈,因此db连接的数量应该是线程池中配置的线程数量的两倍,以便并行执行这些步骤。
如果您提供与游标阅读器的单独连接,也可以解决此问题
JdbcPagingItemReader是ItemReader的另一个实现,它使用为事务打开的相同连接。仅供参考,为什么在使用CursorItemReader(JDBCCursorItemReader或HibernateCursorItemReader)时会出现连接限制问题
即使已经为事务打开了连接(读卡器->处理器->写入器),cursorItemReader也会打开一个单独的连接。因此,每个步骤的执行都需要两个连接,即使它在单个事务中,并且访问相同的数据库。这会导致连接瓶颈,因此db连接的数量应该是线程池中配置的线程数量的两倍,以便并行执行这些步骤。
如果您提供与游标阅读器的单独连接,也可以解决此问题
JdbcPagingItemReader是ItemReader的另一个实现,它使用为事务打开的相同连接