账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Spring Data Jpa findOne()比findById()执行速度慢很多
    45
    0

    我写了两个实体类,A, B,其中A和B是一对多的关系,A类和C类也有主外键关联。如下
    A类:

    @Entity
    public class A implements Serializable {
        private static final long serialVersionUID = 1L;
    
        @Id
        @GenericGenerator(name = "idGenerator", strategy = "uuid")
        @GeneratedValue(generator = "idGenerator")
        private String id;
    
        @Column(nullable = false)
        @NotBlank
        private String name;
        
        @ManyToOne
        @JoinColumn(name = "cId", referencedColumnName="id")
        private C c;
    }
        

    B类:

    @Entity
    public class B implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        @Id
        @GenericGenerator(name = "idGenerator", strategy = "uuid")
        @GeneratedValue(generator = "idGenerator")
        private String id;
    
        @Column(nullable = false)
        @NotBlank
        private String name;
        
        @ManyToOne
        @JoinColumn(name = "aId", referencedColumnName="id")
        private A a;
    }
        
    在做查询的时候,BRepository.findOne(id) 的执行速度非常慢,大概要6s,但是用BRepository.findFirstById(id) 就快很多,大概是100ms。
    其中ARepository.findOne(id)执行也很快,300ms左右,我觉得应该是B实体类的问题,会不会是因为B关联A,但是A又关联C,导致B里面有多重关联。可是不明白findOne为什么比findBy这种要慢那么多。求大神指教 
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 东街烂人〆 普通会员 1楼

      在Spring Data JPA中,findOne()findById()都是用于查询数据库表中的数据的方法,但它们在性能上可能会有所不同。

      findOne()是JPA的一个核心方法,它返回一个特定的记录(或集合)对象,如果在数据库表中不存在该记录,那么它将返回null。如果找到了匹配的记录,findOne()方法会直接返回该记录,而不需要执行任何额外的查询或操作。这个方法的主要优势在于其在查找和获取匹配记录时的直接性和效率。

      findById()是JPA的一个辅助方法,它根据给定的ID查询数据库表中的记录。如果在数据库表中存在该ID对应的记录,findById()方法将返回该记录,否则,它将返回null。findById()方法的主要优势在于它可以自动处理各种异常,包括找不到匹配记录的情况,而不需要手动进行异常处理。

      在性能上,findOne()方法通常比findById()方法快,原因如下:

      1. 在数据库查询之前,JPA会检查缓存(如内存中的数据映射或JPA的默认配置)来确定是否存在匹配的记录。如果存在,JPA会直接返回记录,而不是执行额外的查询。这通常会比直接从数据库中检索数据快得多。

      2. JPA使用了一种称为JPA查询优化器的机制,它可以自动优化查询语句,以提高查询性能。例如,如果findOne()方法在大多数情况下都会返回null,JPA查询优化器可能会在执行findOne()方法时,直接返回null,而不是执行额外的查询。

      3. 如果findOne()方法需要执行大量的查询,例如在一个大规模的数据表中查找大量的记录,那么JPA的性能可能会受到较大的影响。在这种情况下,JPA可能会将查询限制在一个较小的集合上,或者使用批量查询,而不是一次性从数据库中检索所有的记录。

      因此,如果你需要在数据库中快速查找和获取特定的记录,那么findOne()方法是一个更好的选择。如果你需要处理多种异常情况,或者需要执行大量的查询,那么findById()方法可能更适合你。但是,需要注意的是,无论使用哪种方法,如果你的数据库表非常大,那么在查询性能上,仍然可能面临一定的性能瓶颈。在这种情况下,你可能需要考虑优化数据库设计,如使用分区、索引等方法,或者考虑使用更高级的数据处理技术,如分布式查询、流式处理等。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部