不必要的数据库事务导致缓慢?

时间:2017-04-25 22:32:37

标签: java spring postgresql hibernate transactions

我在Spring,Java,Hibernate,Postgresql环境中工作。我看到我的数据库有一些非常严重的缓慢。我的具体问题是,如果我将Spring的@Transactional注释添加到包含没有命中数据库的方法的类中,有多糟糕?换句话说,他们不需要交易。假设这些方法是一些更常用的方法。

这样的事情(只是一个例子):

@Component
@Transactional
public class ProjectManager {

    public String getProjectUrl(Project project) {
         //simple logic that does not use the database
         return "/my/url/" + project.getId();
    }

}

据我所知,有很多因素会导致数据库运行缓慢。我只是想知道这是一个巨大的红旗还是没有那么大的交易?我应该将这些方法拉出来并将它们放入一个未标有@Transactional的其他类吗?

TIA

1 个答案:

答案 0 :(得分:4)

首先,您的getProjectUrl方法将被弹簧方面拦截,即:

  1. 根据需要创建交易
  2. 调用您的方法
  3. 完成交易
  4. spring docs详细描述了这一点。另外,Spring并不够聪明,无法理解方法代码根本不使用DB(as we see see in source)。

    因此,我们可以肯定地得出结论,Spring的 @Transactional会导致一些开销

    但是什么样的开销?

    • Java无论如何 - 方面代码实现
    • 根据@Transactional的{​​{3}}值,我们可能会被迫创建物理(DB)事务。这会导致网络+连接+数据库端开销。

    从另一方面来说,如果删除@Transactional,您还应该知道 Postgres在隐式事务中包装任何非事务性SQL查询propagation):

      

    PostgreSQL实际上将每个SQL语句视为在事务中执行。如果你没有发出BEGIN命令,那么每个单独的语句都有一个隐含的BEGIN和(如果成功)COMMIT包围它。

    最后,答案是:如果您的方法不处理数据库,请不要使用@Transactional