提问人:asu 提问时间:10/6/2023 最后编辑:asu 更新时间:10/10/2023 访问量:63
春季批次。长时间步进执行时连接关闭
Spring batch. Connection closed when long time step execution
问:
我有几个步骤(步骤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();
我正在考虑增加最大寿命,但这是个好主意。 如何解决这个问题?
答:
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。
评论