春季批次。长时间步进执行时连接关闭

Spring batch. Connection closed when long time step execution

提问人:asu 提问时间:10/6/2023 最后编辑:asu 更新时间:10/10/2023 访问量:63

问:

我有几个步骤(步骤0、步骤1、步骤2)。连接池 - Hikari,最长生存期 30 分钟。数据库 - Postgres Step1 是很长的时间。如果执行时间超过 30 分钟(可能是 1 小时、3 小时),我会得到异常:

'2023-10-05 13:34:29,566 ERROR [http-nio-8097-exec-1] o.s.t.i.TransactionInterceptor - Application exception overridden by rollback exception 
 org.springframework.dao.DataAccessResourceFailureException: PreparedStatementCallback; SQL [UPDATE dhs_sout.BATCH_STEP_EXECUTION_CONTEXT
SET SHORT_CONTEXT = ?, SERIALIZED_CONTEXT = ?
WHERE STEP_EXECUTION_ID = ?
.....
.....
.....
Caused by: java.sql.SQLException: Connection is closed
    at com.zaxxer.hikari.pool.ProxyConnection$ClosedConnection.lambda$getClosedConnection$0(ProxyConnection.java:502)'.

步骤1的配置:

 return new StepBuilder("step1", jobRepository)
            .<UUID, UUID>chunk(employeeTmpProcessorPageSize, transactionManager)
            .reader(employeeTmpReader)
            .writer(employeeTmpWriter)
            .faultTolerant()
            .skipLimit(step1SkipLimit)
            .skip(RuntimeException.class)
            .allowStartIfComplete(true)
            .listener(new SPItemProcessorListener())
            .taskExecutor(taskExecutor)
            .build();

我正在考虑增加最大寿命,但这是个好主意。 如何解决这个问题?

Exception Spring-Batch Hikaricp 英语

评论


答:

0赞 Mahmoud Ben Hassine 10/10/2023 #1

Spring Batch 无法阻止数据库服务器关闭连接,如果连接超过超时。

因此,如果该步骤花费的时间可能超过数据库连接的最大超时时间,则需要增加超时(或者更好的是,如果可能,请尝试优化该步骤的性能)。

评论

0赞 asu 10/10/2023
感谢您的回复。这是春季批次陷阱 ) 。可能存在更改 Sring 批处理行为的方法,除了批处理元表的保持连接?
0赞 Mahmoud Ben Hassine 10/10/2023
Spring Batch 使用的作业存储库基于给定的预配置数据源(您可以根据需要自行配置)。Spring Batch 中没有用于连接超时的参数(这是一个与数据源本身相关的参数)。
0赞 asu 10/25/2023
感谢您的回复。我找到了解决方案。但这不是好的解决方案)1)使用ResourcelessTransactionManager进行步骤和JobRepositoryFactoryBean 2)在内存中使用DB进行JobRepository。