SPRING BATCH:嵌套异常是java.sql.SQLException:ORA-08177:无法序列化此事务的访问权限

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SPRING BATCH:嵌套异常是java.sql.SQLException:ORA-08177:无法序列化此事务的访问权限相关的知识,希望对你有一定的参考价值。

当我们尝试同时运行多个作业时,我们正面临着上述问题。

下面是spring批处理作业中的一个tasklet的功能。

Tasklet1:为外部系统A生成消息,持久保存消息ID,向外部系统发送消息,停止弹出批处理作业(我正在停止此作业,因为我对外部系统没有任何控制权,我不知道什么时候我会收到系统的回复)

下面是监听器,它始终运行以监听外部系统的响应。

listener1 -listener从外部系统A侦听响应,收到响应时刻,侦听器类通过在DB中保留作业ID重新启动相同的作业。

如果我运行一个或两个作业,它完成没有任何问题,但如果我尝试并行运行20个作业,那么至少有5个作为标题中提到的上述异常失败。

我不知道我该怎么做才能完成所有工作。

我已经将“isolation-level-for-create”更改为“READ_COMMITTED”,这对我没有帮助。

任何帮助将受到高度赞赏。

谢谢。

更新:我已经尝试为作业存储库创建bean并使用aop,如下所示。

<aop:config>
        <aop:pointcut id="allRepositoryMethods"
            expression="execution(* org.springframework.batch.core..*Repository+.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="allRepositoryMethods" />
    </aop:config>
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <tx:method name="*" isolation="READ_COMMITTED" />
        </tx:attributes>
    </tx:advice>

但这是在抛出错误

“IllegalStateException在JobRepository中检测到现有事务。请修复此问题并重试(例如从客户端删除@Transactional注释)”

我已经确保删除所有方法中的@Transactional,但我仍然得到上述错误。

任何的想法 ?

.

答案

JobRepositoryFactoryBean.isolationLevelForCreate应该设置的值是'ISOLATION_READ_COMMITTED',而不仅仅是'READ_COMMITTED'

另一答案

是的,放在线下不会工作:

jobRepositoryFactoryBean.setIsolationLevelForCreate(Isolation.READ_COMMITTED.toString());

我们需要包括ISOLATION_READ_COMMITTED来设置值。

jobRepositoryFactoryBean.setIsolationLevelForCreate("ISOLATION_READ_COMMITTED");

这会工作!!!

以上是关于SPRING BATCH:嵌套异常是java.sql.SQLException:ORA-08177:无法序列化此事务的访问权限的主要内容,如果未能解决你的问题,请参考以下文章

Spring Batch tasklet中的嵌套事务不起作用

Spring-batch:如何在 Spring Batch 中使用 skip 方法捕获异常消息?

Spring-Batch学习总结——重要概念,环境搭建,名词解释,第一个项目及异常处理

如果写入元素发生异常,如何正确处理 Spring Batch 步骤编写器异常以便继续处理其他元素?

ItemWriter 的 Spring Batch 跳过异常

Spring Batch SkipPolicy在处理异常时陷入无限循环