【问题标题】:TransactionSystemException in Long running Spring Batch Jobs长时间运行的 Spring Batch 作业中的 TransactionSystemException
【发布时间】:2015-04-30 00:00:34
【问题描述】:

我有一个 Spring Batch 作业,有时运行时间超过 2700 秒。当他们这样做时,我注意到来自 spring 批处理框架的异常。

SpringFramework 版本:

<spring-batch.version>2.2.7.RELEASE</spring-batch.version>
<spring.framework.version>4.0.3.RELEASE</spring.framework.version>

这里是工作的定义:

<batch:job id="MyJob">
    <batch:step id="trigger-job" next="poll-job">
        <batch:tasklet ref="triggerJobStep" />
        <batch:listeners>
            <batch:listener ref="phaseStepListener" />
        </batch:listeners>
    </batch:step>
    <batch:step id="poll-job">
        <batch:tasklet ref="pollJobStatusStep" />
        <batch:listeners>
            <batch:listener ref="phaseStepListener" />
        </batch:listeners>
    </batch:step>

    <batch:listeners>
        <batch:listener ref="phaseCompletionListener" />
    </batch:listeners>
</batch:job>

似乎与数据库的连接已用完。

当我轮询需要很长时间的服务时,总是会发生此问题。

如果有任何建议或其他方法,请告诉我!

另请注意,对于运行时间不是很长

如果您需要更多信息,请告诉我。

谢谢, 戴夫

作业的堆栈跟踪:

"errorMessage":"Step requested termination: StepExecution: id=15365, version=2, name=poll-cmpaas-deploy, status=UNKNOWN, exitStatus=FAILED, readCount=0, filterCount=0, writeCount=0 readSkipCount=0, writeSkipCount=0, processSkipCount=0, commitCount=0, rollbackCount=1, 
exitDescription=org.springframework.transaction.TransactionSystemException: Could not roll back JPA transaction; nested exception is javax.persistence.PersistenceException: unexpected error when rollbacking
    at org.springframework.orm.jpa.JpaTransactionManager.doRollback(JpaTransactionManager.java:546)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:849)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:826)
    at org.springframework.transaction.support.TransactionTemplate.rollbackOnException(TransactionTemplate.java:164)
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:137)
    at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:267)
    at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:77)
    at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:368)
    at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215)
    at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:144)
    at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:253)
    at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:195)
    at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:141)
    at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:64)
    at org.springframework.batch.core.job.flow.support.state.StepState.handle(StepState.java:60)
    at org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:151)
    at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:130)
    at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:135)
    at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:301)
    at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:134)
    at java.lang.Thread.run(Unknown Source)
Caused by: javax.persistence.PersistenceException: unexpected error when rollbacking
    at org.hibernate.jpa.internal.TransactionImpl.rollback(TransactionImpl.java:111)
    at org.springframework.orm.jpa.JpaTransactionManager.doRollback(JpaTransactionManager.java:542)
    ... 20 more
Caused by: org.hibernate.TransactionException: rollback failed
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.rollback(AbstractTransactionImpl.java:217)
    at org.hibernate.jpa.internal.TransactionImpl.rollback(TransactionImpl.java:108)
    ... 21 more
Caused by: org.hibernate.TransactionException: unable to rollback against JDBC connection
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doRollback(JdbcTransaction.java:167)
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.rollback(AbstractTransactionImpl.java:211)
    ... 22 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communications link failure during rollback(). Transaction resolution unknown.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.Util.getInstance(Util.java:386)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)
    at com.mysql.jdbc.ConnectionImpl.rollback(ConnectionImpl.java:5101)
    at com.mchange.v2.c3p0.impl.NewProxyConnection.rollback(NewProxyConnection.java:860)
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doRollback(JdbcTransaction.java:163)
    ... 23 more
Could not roll back JPA transaction; nested exception is javax.persistence.PersistenceException: unexpected error when rollbacking","warningMessage":null,"data":null}'

【问题讨论】:

    标签: spring-batch jobs rollback


    【解决方案1】:

    您的数据库连接将在 45 分钟后断开。您的服务器正在杀死它,或者(更有可能)您的应用程序和数据库之间有防火墙正在杀死长时间打开的持久连接(防火墙通常会切断持久连接,无论它们是否在一段时间后使用时间)。假设它是防火墙,您需要将其配置为不切断连接。

    【讨论】:

    • 谢谢迈克尔,我发现数据库连接断开存在问题。这是我的问题。在我的工作中,我并没有完全使用数据库。看来 SpringBatch 有问题。那么其他人如何处理可能运行 10-14 小时的工作呢?我可以使用另一种策略吗?在我的工作中,我有一个步骤是监控另一个进程。这一步有一个带睡眠的while循环。当这个其他过程完成时,作业退出。感谢您的任何意见或建议。
    • 我发现了问题。在我的步骤中,我有一个循环正在等待工作完成。如果时间超过某个较长的时间段(如 40 多分钟),SpringBatch 显然不喜欢这样。解决方案是返回 RepeatStatus.CONTINUABLE 并再次调用。
    猜你喜欢
    • 2012-10-09
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    相关资源
    最近更新 更多