• Spring-data-jpa n+1问题


    Spring-data-jpa的n+1问题

    当我们使用JPA提供给我们的find方法时,如果查询出来的对象关联着另外10个对象,那么JPA将会发送1+10次查询(这个对象本身要查询一次,然后每个关联对象再查询一次)

    解决方案:

    1.使用FetchType.EAGER+FetchMode.JOIN 的形式,使得可以自动生成一条带有LEFT OUTER JOIN 的SQL语句(前提:必须存在主外键关联,否则无效)

    例如:

    此时,即使设置了FetchType.EAGER+FetchMode.JOIN,同样会存在N+1的问题。

    2.使用JPA2.1特性 @NamedEntityGraph注解,这是JPA推出专门优化解决JPA效率的注解。使用方式如下。

    先在实体类上做声明:

    然后再在Repository接口中使用@EntityGraph引用

    <注>可以根据不同的问题场景,定义不同的@NamedEntityGraph,切记不要关联与业务无关的关联对象,因为会去进行JOIN表,会造成不必要的性能损耗。

    关于在Spring-data-jpa框架下使用Hibernate Predicate时解决N+1问题

    解决方案同Spring-data-jpa,区别是,由于在Hibernate 的Predicate中调用的是JpaSpecificationExecutor中的findAll,所以需要在Repository中覆盖对应的findAll方法,然后添加对应的EntiryGraph的注解,例如

    3.使用batchSize(size=10) 进行批处理

    4.使用懒加载

  • 相关阅读:
    caffe简单介绍
    良好地去规划自己的学习
    计算机视觉开篇---读史可以明智
    Oracle的闪回操作
    数据库的管理
    oracle dblink结合同义词的用法 PLS-00352:无法访问另一数据库
    一次导如数据库时主表数据丢失的解决过程
    Oracle函数的使用
    MinGW和MSYS的自动安装 【转】
    Oracle表的管理
  • 原文地址:https://www.cnblogs.com/ymqj520/p/11589934.html
Copyright © 2020-2023  润新知