在执行事务下执行只读查询时是否存在性能损失?

时间:2011-10-10 15:25:10

标签: java spring-jdbc spring-transactions

使用基于Spring AOP的声明式事务管理将所有方法定义为事务性是否存在性能损失?请参阅下面的配置。原因是我不知道开发人员将为非事务方法提供什么方法​​。一个选项是我从通配符列表开始,如果方法名称不属于定义的列表,开发人员会更新列表。

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" />
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut id="dtxops" expression="bean(*Service)" />
    <aop:advisor advice-ref="txAdvice" pointcut-ref="dtxops" />
</aop:config>

2 个答案:

答案 0 :(得分:1)

这取决于您使用的基础事务管理器。默认弹簧“每个线程的事务,没有XA事务”可能没有任何惩罚。如果您将JBoss与XA事务管理器一起使用,那么它会将一些数据写入事务日志。

- 原创 - 即便如此,我认为你会发现性能损失相当小。

- 已编辑 - 根据我的经验,在使用JBoss事务管理器转换为Readonly时,我没有看到性能的大幅提升。根据下面的评论,至少有一位用户看到了30%的性能提升,这是非常重要的。

答案 1 :(得分:1)

从理论上讲,将AOP(以及因此内省/反射)开销添加到超出必要的方法的性能是一种表现。此外,打开和关闭更多交易的额外开销超出了需要。应该由编写数据访问层的开发人员知道何时以及是否应该启动事务IMHO。