春季批次仍在EXECUTING中

时间:2013-06-27 16:07:30

标签: java spring spring-batch

我创建了一个使用类型读者的工作 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".

春季批次如何管理这些致命的失败情况?我是否必须手动删除这些执行信息或是否有重置选项? 感谢您的帮助

2 个答案:

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