我在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
答案 0 :(得分:4)
首先,您的getProjectUrl
方法将被弹簧方面拦截,即:
spring docs详细描述了这一点。另外,Spring并不够聪明,无法理解方法代码根本不使用DB(as we see see in source)。
因此,我们可以肯定地得出结论,Spring的 @Transactional
会导致一些开销。
但是什么样的开销?
@Transactional
的{{3}}值,我们可能会被迫创建物理(DB)事务。这会导致网络+连接+数据库端开销。从另一方面来说,如果删除@Transactional
,您还应该知道 Postgres在隐式事务中包装任何非事务性SQL查询(propagation
):
PostgreSQL实际上将每个SQL语句视为在事务中执行。如果你没有发出BEGIN命令,那么每个单独的语句都有一个隐含的BEGIN和(如果成功)COMMIT包围它。
最后,答案是:如果您的方法不处理数据库,请不要使用@Transactional
。