gpt4 book ai didi

java - hibernate 确实很慢。如何让它更快?

转载 作者:行者123 更新时间:2023-11-30 07:31:33 25 4
gpt4 key购买 nike

在我的应用程序中。我有 Case,每个 Case 可以有 0 到 2 个 Claim。如果一个 Case 有 0 个 claim ,它运行得非常快,有 1 个 claim ,它就会变慢,而 2 个 claim 则非常慢。知道如何让它更快吗?我不知道我的案例和 claim 是否来回导致无限递归,因此我添加了 JsonManagedReference 和 JsonBackReference,但这似乎对速度没有太大帮助。有任何想法吗?这是我的 Case.java:

@Entity
public class Case {
@OneToMany(mappedBy="_case", fetch = FetchType.EAGER)
@Fetch(FetchMode.JOIN)
@JsonManagedReference(value = "case-claim")
public Set<Claim> claims;
}

在Claim.java中:

@Entity
public class Claim implements Cloneable {

@ManyToOne(optional = true)
@JoinColumn(name = "CASE_ID")
@JsonBackReference(value = "case-claim")
private Case _case;
}

输出 0 条声明: https://gist.github.com/elmatt/2cafbe7ecb1fa0b7f6a8

输出 2 个声明: https://gist.github.com/elmatt/b000bc28909453effc95

最佳答案

您的问题与Case和Claim之间的关系无关。

仅供引用:300 毫秒并不是“相当快”。您的问题是您希望 Hibernate 能够神奇地快速向您提供复杂的对象层次结构,而无需您付出任何特别的努力。我将 ORM 视为“弥天大谎”——它非常易于使用,并且在解决玩具问题上效果很好,但当您尝试扩展到有趣的应用程序(例如您的应用程序)时,它往往会严重失败。

不要放弃 hibernate ,但要意识到你需要比你想象的更加努力才能让它为你工作。

我碰巧在类似的数据领域工作(裁决后医疗保健 claim 分析和处理)。您应该能够在每个声明(包含所有相关维度)10 毫秒内,在适度的硬件上使用 MySQL 从包含超过 10 亿声明的表中选择此类数据,并且数据库托管在与应用程序不同的服务器上。

你如何从现在的位置到达你应该到达的位置?1. 通过最大限度地减少执行的单独查询的数量,最大限度地减少数据库的往返次数。2. 手工制作重要的查询以仅获取您实际需要的行和联接。3.使用explain plan在每个查询上确保它以正确的顺序命中表,并且每个步骤都得到索引的适当支持。4. 考虑对大表进行分区,并在查询中包含分区条件,以启用分区修剪,将查询集中在正确的数据上。5. 非常犹豫是否让 hibernate 管理实体之间的关系。我一般不会让hibernate处理任何关系。

几年前,我开发了一款 iPhone 应用程序产品,用户可以在其中浏览工作流程(例如,护士测量患者的生命体征),每个屏幕都会往返应用程序服务器以执行工作流程步骤并获取下一屏幕的数据。想想你在 iPhone 屏幕上可以使用的数据有多么少。然而,往返的数据库部分通常需要 2-5 秒才能执行。那里的每个人都认为这是理所当然的,因为“这就是它一直需要的时间。”我深入研究了代码,发现每个步骤都拉入了数据库的很大一部分(然后没有被业务逻辑使用)。

他们唯一一次调整默认的 hibernate 行为是因为连接太多而出现异常(是的,MySQL 有一个查询中最多只能有 67 个表的限制)。

创建 Java 数据模型并简单地将其 ORM 到数据库中的方法通常在配置数据等方面效果很好,但对于涉及事务数据的复杂数据模型往往表现不佳。这就是现在困扰你的问题。

您的问题是完全可以解决的,并且可以逐步进行攻击 - 您不必拆散整个应用程序来开始让事情变得更好。

关于java - hibernate 确实很慢。如何让它更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36046813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com