- 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 条
- 全部回答
-
东街烂人〆 普通会员 1楼
在Spring Data JPA中,
findOne()和findById()都是用于查询数据库表中的数据的方法,但它们在性能上可能会有所不同。findOne()是JPA的一个核心方法,它返回一个特定的记录(或集合)对象,如果在数据库表中不存在该记录,那么它将返回null。如果找到了匹配的记录,findOne()方法会直接返回该记录,而不需要执行任何额外的查询或操作。这个方法的主要优势在于其在查找和获取匹配记录时的直接性和效率。findById()是JPA的一个辅助方法,它根据给定的ID查询数据库表中的记录。如果在数据库表中存在该ID对应的记录,findById()方法将返回该记录,否则,它将返回null。findById()方法的主要优势在于它可以自动处理各种异常,包括找不到匹配记录的情况,而不需要手动进行异常处理。在性能上,
findOne()方法通常比findById()方法快,原因如下:-
在数据库查询之前,JPA会检查缓存(如内存中的数据映射或JPA的默认配置)来确定是否存在匹配的记录。如果存在,JPA会直接返回记录,而不是执行额外的查询。这通常会比直接从数据库中检索数据快得多。
-
JPA使用了一种称为JPA查询优化器的机制,它可以自动优化查询语句,以提高查询性能。例如,如果
findOne()方法在大多数情况下都会返回null,JPA查询优化器可能会在执行findOne()方法时,直接返回null,而不是执行额外的查询。 -
如果
findOne()方法需要执行大量的查询,例如在一个大规模的数据表中查找大量的记录,那么JPA的性能可能会受到较大的影响。在这种情况下,JPA可能会将查询限制在一个较小的集合上,或者使用批量查询,而不是一次性从数据库中检索所有的记录。
因此,如果你需要在数据库中快速查找和获取特定的记录,那么
findOne()方法是一个更好的选择。如果你需要处理多种异常情况,或者需要执行大量的查询,那么findById()方法可能更适合你。但是,需要注意的是,无论使用哪种方法,如果你的数据库表非常大,那么在查询性能上,仍然可能面临一定的性能瓶颈。在这种情况下,你可能需要考虑优化数据库设计,如使用分区、索引等方法,或者考虑使用更高级的数据处理技术,如分布式查询、流式处理等。 -
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
