【发布时间】: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_Supported 和 8,95 秒。对于 @Never -> @Supports。
@Never-contexts 执行这么长时间可以吗?我的意思是我们甚至没有要暂停和恢复的事务。也许我错过了一些关于@Never 事务属性的常识?
我使用 Java EE 6、GlassFish 3、MySQL 5.1.69 InnoDB。
提前致谢。
【问题讨论】:
标签: mysql jakarta-ee transactions annotations glassfish