Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不必要的数据库事务会导致速度变慢吗?_Java_Spring_Postgresql_Hibernate_Transactions - Fatal编程技术网

Java 不必要的数据库事务会导致速度变慢吗?

Java 不必要的数据库事务会导致速度变慢吗?,java,spring,postgresql,hibernate,transactions,Java,Spring,Postgresql,Hibernate,Transactions,我在Spring、Java、Hibernate和Postgresql环境中工作。我发现我的数据库速度非常慢。我的具体问题是,如果我将Spring的@Transactional注释添加到一个包含不命中数据库的方法的类中,情况会有多糟?换句话说,它们不需要事务。假设这些方法是一些更常用的方法 类似这样的事情(只是一个例子): 我知道有很多因素会导致数据库速度缓慢。我只是想知道这是一个巨大的危险信号还是不是一个大问题?我是否应该将这些方法提取出来,并将它们放入未标记为@Transactional的其他

我在Spring、Java、Hibernate和Postgresql环境中工作。我发现我的数据库速度非常慢。我的具体问题是,如果我将Spring的
@Transactional
注释添加到一个包含不命中数据库的方法的类中,情况会有多糟?换句话说,它们不需要事务。假设这些方法是一些更常用的方法

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

我知道有很多因素会导致数据库速度缓慢。我只是想知道这是一个巨大的危险信号还是不是一个大问题?我是否应该将这些方法提取出来,并将它们放入未标记为
@Transactional
的其他类中


TIA

首先,您的
getProjectUrl
方法将被spring aspect拦截,即:

  • 如果需要,创建事务
  • 调用您的方法
  • 完成交易
  • 这在网站上有很好的描述。此外,Spring还不够聪明,无法理解方法代码根本不使用DB()

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

    但是什么样的开销呢

    • Java在任何情况下都可以实现方面代码
    • 根据
      @Transactional
      的值,我们可能会被迫创建物理(DB)事务。这会导致网络+连接+数据库端开销
    另一方面,如果您删除了
    @Transactional
    ,您还应该知道Postgres将任何非事务性SQL查询包装在隐式事务中():

    PostgreSQL实际上将每个SQL语句视为在事务中执行。如果不发出BEGIN命令,则每个语句都有一个隐含的BEGIN和(如果成功)COMMIT


    最后,答案是:如果你的方法不处理DB,就不要使用
    @Transactional

    你有没有关于这个方法的基准测试,有没有
    @Transactional
    注释?“如果我添加Spring的
    @Transactional
    注释的话有多糟糕,除非你分析了代码,它说你有问题,我怀疑它会有问题。我不能100%确定它是否有帮助,但你可以找到使用
    @Transactional
    @Component
    @Transactional
    public class ProjectManager {
    
        public String getProjectUrl(Project project) {
             //simple logic that does not use the database
             return "/my/url/" + project.getId();
        }
    
    }