java–Spring Transactional减慢了整个过程

java–Spring Transactional减慢了整个过程,第1张

概述我试图分析一下我有两个班级的情况.一个类是ProcessImpl,它是起点并在内部调用其他子事务.我不知道什么是错误的.processImpl正在导入一些东西并将相关数据写入数据库. Specs Spring-orm版本:3.2.18.RELEASE.JDK版本:1.8.Db:H2(记录任何db相同的性能). Issue 如果我从ProcessImp

我试图分析一下我有两个班级的情况.一个类是ProcessImpl,它是起点并在内部调用其他子事务.我不知道什么是错误的.
processImpl正在导入一些东西并将相关数据写入数据库.

@H_404_6@

Specs

@H_419_9@

Spring-orm版本:3.2.18.RELEASE.

JDK版本:1.8.

Db:H2(记录任何db相同的性能).

@H_404_6@

Issue

@H_419_9@

如果我从ProcessImpl.processstage()中删除@Transactional,则该过程需要约50秒
如果我从ProcessImpl.processstage()保留@Transactional,则该过程需要大约15分钟.
不知道为什么会这样.
我一直试图解决这个问题,但没有运气.请看下面的代码.

需求:
完整的processstage()应该完全或完全回滚,即使其中一个子事务失败.

Fyi:我也收到很多消息:“参与现有交易”.试图通过将propagation = Propagation.nesTED添加到processstage()但没有工作来克服这个问题.

@H_404_6@

ProcessImpl Class.

@H_419_9@
public class ProcessImpl {    /*This is the big transaction that calls other transactional stuff from MyServiceImpl    * This is starting point you can say for the process...    *     * If we remove @Transactional from here the process is lightning fast     * With transactional : 15minutes    * Without transactional : 50 seconds    * */    @Transactional    public voID processstage(){        MyServiceImpl mp = new MyServiceImpl();        //do some stuff        mp.doWork1();        //do more work        mp.doWork2();    }}
@H_404_6@

MyServiceImpl Class

@H_419_9@
class MyServiceImpl{    @Transactional    public voID doWork1(){        Object o = doChilDWork();        // and more stuff        //calls other class services and dao layers    }    @Transactional    public voID doWork2(){        //some stuff        doChilDWork2();        doChilDWork();        //more work    }    @Transactional    public Object doChilDWork(){        return new Object(); //hypothetical,I am returning List and other collection stuff    }    @Transactional    public Object doChilDWork2(){        return new Object(); //hypothetical,I am returning List and other collection stuff    }}

此外,我将在这里获得自我调用问题,这在Transactional中是不可取的?最佳答案很难猜测代码中究竟发生了什么,但这可能存在以下问题:

锁定数据库级别.
当您在doWork1()和doWork2()中更新相同的DB对象时,可能会发生这种情况.由于两个方法都在一个事务中执行,因此在doWork2()完成之前,不会提交在doWork1()内完成的更新.这两种方法都可能尝试锁定同一个DB对象并等待它.从技术上讲,它可以是任何数据库对象:表中的行,索引,整个表等.

分析您的代码并尝试找到可以锁定的内容.您还可以在方法运行时查看数据库事务日志.所有流行的DB都提供有助于查找有问题的地方的功能.

在Hibernate上下文刷新期间减慢速度.如果你更新了太多的对象,ORM引擎(比如说Hibernate)必须将它们下沉并将它们保存在内存中.字面上,Hibernate必须具有所有旧状态和更新对象的所有新状态.有时这样做非常不理想.

您可以使用deBUG指出这一点.尝试找到最慢的地方,并检查那里正在调用的是什么.我可能会猜测,当hibernate更新缓存状态时,它会变慢.

还有一个问题.我看到你在processstage()期间使用构造函数创建了MyServiceImpl.我建议您通过d簧自动装配替换此代码.首先,你使用它的方式不是它的设计使用方式,但理论上也可能以某种方式影响执行.

@H_404_6@

will I get self invocation issue,which is not advisable in Transactional?

@H_419_9@

不,它会很好地忽略所有注释.在doWork2()中调用doChilDWork()和doChilDWork2()将被视为标准java调用(只要您直接调用它们,spring就无法向它们添加任何“魔法”). 总结

以上是内存溢出为你收集整理的java – Spring Transactional减慢了整个过程全部内容,希望文章能够帮你解决java – Spring Transactional减慢了整个过程所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1268608.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存