@Never事务属性非常慢

时间:2014-03-27 18:54:48

标签: mysql java-ee transactions annotations glassfish

我编写了一些基准,用于估计事务属性的不同组合如何影响Java EE程序的性能。该基准调用一种用' Y'注释的方法。来自方法的注释' X'注解。我的基准交易涵盖了银行转账的情况:

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

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

当我发现最慢的呼叫来自@ Never-annotated caller方法时,我感到非常惊讶:为@Required执行上述1000个呼叫案例 - > @Required场景耗时5,71秒,@ Required - > @RequiresNew 6,35秒,但 9,05 秒。对于 @Never - > @Not_Supported 8,95 秒。对于 @Never - > @Supports

@ Never-contexts可以执行这么久吗?我的意思是我们甚至没有暂停和恢复的交易。也许有一些关于@Never交易属性的一般知识我错过了吗?

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

提前致谢。

1 个答案:

答案 0 :(得分:2)

  

我的意思是我们甚至没有暂停和恢复的交易。

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

  

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

     

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

(以及其他可能性)

  

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