【问题标题】:@Never transaction attribute is terribly slow@Never 事务属性非常慢
【发布时间】:2014-03-27 18:54:47
【问题描述】:

我编写了一个基准,它估计事务属性的不同组合如何影响 Java EE 程序的性能。基准从带有“X”注释的方法中调用带有“Y”注释的方法。我的基准中的交易涵盖了银行转账的情况:

@Required            @RequiresNew
theCallerMethod() -> updateAccount(Account acc)
                     @RequiresNew
                  -> updateOwner(Company c)
                     @RequiresNew
                  -> addLogEntry(Transfer t)

因此,在 callerMethod 事务的上下文中,容器必须暂停调用者的事务、启动新事务、更新帐户、提交、切换到调用者的事务、暂停、启动新事务、更新公司、提交、返回调用者的,挂起,开始另一个,添加日志条目,提交,然后返回调用者方法,最终提交调用者的事务。

当得知最慢的调用来自@Never-annotated 调用方方法时,我感到非常惊讶:为@Required 执行上述 1000 个调用案例 -> @Required 场景需要 5,71 秒,@Required -> @RequiresNew 6,35 秒,但 9,05 秒。 @Never -> @Not_Supported8,95 秒。对于 @Never -> @Supports

@Never-contexts 执行这么长时间可以吗?我的意思是我们甚至没有要暂停和恢复的事务。也许我错过了一些关于@Never 事务属性的常识

我使用 Java EE 6、GlassFish 3、MySQL 5.1.69 InnoDB。

提前致谢。

【问题讨论】:

    标签: mysql jakarta-ee transactions annotations glassfish


    【解决方案1】:

    我的意思是我们甚至没有要暂停和恢复的事务。

    我不会那么肯定。这就是 ejb3.1 specification 所说的:

    13.6.5 处理以“未指定事务上下文”运行的方法

    EJB 规范没有规定容器应如何管理具有未指定事务上下文的方法的执行,事务语义留给容器实现。 容器如何选择执行方法的一些技术 一个未指定的事务上下文如下(列表不包括所有可能的策略):

    (以及其他可能性)

    容器可以将实例对资源管理器的每次调用视为单个事务 (例如,容器可以在 JDBC 连接上设置自动提交选项)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-24
      • 1970-01-01
      • 2015-07-18
      • 2011-12-06
      • 1970-01-01
      • 2014-06-05
      • 2010-10-24
      • 1970-01-01
      相关资源
      最近更新 更多