gpt4 book ai didi

java - Spring Batch - 在外部进程中完成处理时连接关闭

转载 作者:太空宇宙 更新时间:2023-11-04 06:44:03 25 4
gpt4 key购买 nike

  • 我的工作由多个步骤组成 - 其中一个步骤是激活 Pentaho 处理的微线程

  • 我将其所需的参数传递给 Pentaho,以便自行连接到数据库,并且工作正常

  • 当 Pentaho 中的处理时间很长时,我遇到的问题就出现了

  • Pentaho 成功完成,并且激活它的 tasklet 中的代码完成正常,但是在包装它的作业机制中,当它尝试更新数据库中的作业执行表时,我收到错误,因为它的连接已经关闭

     o.s.j.s.SQLErrorCodesFactory: Error while extracting database product name - falling back to empty error codes
    org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData;
    nested exception is
    com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:296)
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:320)
    at org.springframework.jdbc.support.SQLErrorCodesFactory.getErrorCodes(SQLErrorCodesFactory.java:214)
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.setDataSource(SQLErrorCodeSQLExceptionTranslator.java:141)
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.<init>(SQLErrorCodeSQLExceptionTranslator.java:104)
    at org.springframework.jdbc.support.JdbcAccessor.getExceptionTranslator(JdbcAccessor.java:99)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:603)
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:812)
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:868)
    at org.springframework.batch.core.repository.dao.JdbcExecutionContextDao.persistSerializedContext(JdbcExecutionContextDao.java:230)
    at org.springframework.batch.core.repository.dao.JdbcExecutionContextDao.updateExecutionContext(JdbcExecutionContextDao.java:159)
    at org.springframework.batch.core.repository.support.SimpleJobRepository.updateExecutionContext(SimpleJobRepository.java:203)
    ...
    14:21:37.143 UTC [ERROR] jobScheduler_Worker-2 T:b U: o.s.t.i.TransactionInterceptor: Application exception overridden by rollback exception
    org.springframework.dao.RecoverableDataAccessException: PreparedStatementCallback; SQL [UPDATE BAT_STEP_EXECUTION_CONTEXT SET SHORT_CONTEXT = ?, SERIALIZED_CONTEXT = ? WHERE STEP_EXECUTION_ID = ?]; Communications link failure
  • 看起来作业启动时作业存储库收到的连接被放弃了,我试图了解是否有办法命令它获取新连接或给它一些保持 Activity 的命令

我尝试了以下解决方法

  • 更改作业监听器中的步骤状态,以便作业完成 - 因相同的数据库错误而失败

  • 将此异常标记为可以跳过 - 失败并出现相同的数据库错误

     <batch:no-rollback-exception-classes>
    <batch:include class="com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException" />
    <batch:include class="org.springframework.jdbc.support.MetaDataAccessException" />
    </batch:no-rollback-exception-classes>

有什么想法可以解决这个问题吗?

我可以配置一个作业监听器,以便从 Pentaho 步骤之后的步骤重新启 Action 业吗?

其他信息我认为问题就在这里——org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSource)

这个

    ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource);

认为连接有效

所以我想解决方案是调用org.springframework.transaction.support.TransactionSynchronizationManager.unbindResource(Object)

问题是如何将数据源对象传递给此方法

我会尝试查询org.springframework.transaction.support.TransactionSynchronizationManager.getResourceMap() 看看它能帮到我什么

更新不走运 - 获取资源映射只给我正在使用的存储库,而不是数据源。仍在挖掘...

另一更新

我正在调试该过程,看来问题确实是 org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSource) 连接持有者持有一个已关闭的连接,但这里的代码不检查连接是否打开;它只检查连接是否不为空,以及是否是某个弱引用,也许这里就足够了 - 但在这个用例中,它只是继续关闭连接,而不是请求一个新连接。

最佳答案

将其添加到微线程定义中

<batch:transaction-attributes propagation="NEVER" />

由于 Tasklet 正在进行外部处理并且不需要 Spring Batch 事务,因此需要告诉 Spring Batch 不要为此 Tasklet 打开事务。

http://www.javabeat.net/transaction-management-in-spring-batch-components/ http://forum.spring.io/forum/spring-projects/batch/91158-legacy-integration-tasklet-transaction

关于java - Spring Batch - 在外部进程中完成处理时连接关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24266513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com