【问题标题】:Spring-data-JPA - Executing complex multi join queriesSpring-data-JPA - 执行复杂的多连接查询
【发布时间】:2019-12-25 17:53:28
【问题描述】:

我有一个要求,我需要执行一堆具有多个连接的随机复杂查询以用于报告目的。所以我打算直接使用entitymanager原生查询功能。我刚试了一下,好像还可以。

@Service
public class SampleService {

    @Autowired
    private EntityManager entityManager;

    public List<Object[]> execute(String sql){
        Query query = entityManager.createNativeQuery(sql);
        return query.getResultList();
    }

}

此代码每 30 秒调用一次。单线程 - 计划进程。

问题:

  • 我应该使用实体管理器还是实体管理器工厂?
  • 我应该在这里关闭连接吗?还是自动管理?
  • 如何减少数据库连接池 - 因为它不是多线程应用程序,或者我应该不担心吗?
  • 还有其他建议吗!?

【问题讨论】:

    标签: spring-boot spring-data-jpa


    【解决方案1】:

    我应该使用实体管理器还是实体管理器工厂? Injecting EntityManager Vs. EntityManagerFactory

    EntityManager 在这种情况下看起来不错。

    我应该在这里关闭连接吗?还是自动管理? 不,我认为您不需要经理处理此问题。

    如何减少数据库连接池 - 因为它不是多线程应用程序,或者我应该不担心吗?

    我怀疑您是否需要关注连接池,除非您期望有大量数据并且您的应用程序在负载下运行缓慢。尝试做一些基准测试,您可能拥有比您需要的更多的容量并且过早地优化您的应用程序。 您更有可能增加而不是减少连接数。要增加连接数,请在 application.properties(或 application.yml)中执行此操作

    还有其他建议吗!?

    我会考虑在服务之外拥有一个单独的存储库类,并让该存储库方法执行特定的操作,而不是使用通用方法。让方法返回特定的结果或事物,而不是传入任何 sql。

    作为两个单独的类(文件)的粗略轮廓,像这样

    @Service
    public class SampleService {
    
      @Autowired
      private MyAuthorNativeRepository myAuthorNaviveRepository;
    
      public List<Author> getAuthors(){
        return myAuthorRepository.getAuthors();
      }
    
    }
    
    
    @Service
    public class MyAuthorNativeRepository {
    
      @Autowired
      private EntityManager entityManager;
    
      public List<Author> getAuthors(){
    
        Query q = entityManager.createNativeQuery("SELECT blah blah FROM Author");
    
        List<Author> authors = new ArrayList();
    
        for (Object[] row : q.getResultList()) {
           Author author = new Author();
           author.setName(row[0]);
    
    
            authors.add(author);
        }
        return authors;
      }
    }
    

    【讨论】:

    • 非常感谢您的详细解答。
    猜你喜欢
    • 2017-04-21
    • 2021-01-06
    • 2016-01-31
    • 2018-10-31
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多