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的另一个实现,它使用为事务打开的相同连接