1

我创建了一个使用类型读取器 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".

Spring Batch 如何管理这些致命的失败情况?我必须手动删除这些执行信息还是有重置选项?感谢您的任何帮助

4

2 回答 2

1

Spring Batch (2.2.0) 的当前版本似乎没有针对这种情况的开箱即用解决方案。如本问题所述,可能需要对数据库进行“手动”干预。或者,如果这是一个挂起的特定作业(也就是说,您知道作业名称),您也可以执行以下操作;

  • 使用JobExplorer.findRunningJobExecutions(jobName)
  • 浏览执行列表并“失败”它们(JobExecution.upgradeStatus(BatchStatus.FAILED)
  • 使用保存更改JobRepository.update(jobExecution)
于 2013-06-28T11:02:02.900 回答
0

仅供参考,为什么在使用 CursorItemReader(JDBCCursorItemReader 或 HibernateCursorItemReader)时会出现此连接限制问题

即使已经为事务打开了一个连接, cursorItemReader 也会打开一个单独的连接(Reader -> Processors -> Writer)。因此,每个步骤执行都需要两个连接,即使它在单个事务中并访问同一个数据库。这会导致连接瓶颈,因此数据库连接数应该是线程池中配置的线程数的两倍,以并行执行这些步骤。如果您提供与 CursorReader 的单独连接,也可以解决此问题。

JdbcPagingItemReader 是 ItemReader 的另一个实现,它使用为事务打开的相同连接。

于 2014-03-21T18:17:59.407 回答