【问题标题】:Hibernate performance [closed]休眠性能[关闭]
【发布时间】:2011-03-01 14:18:31
【问题描述】:

我有疑问,也许是从被认为愚蠢的人那里提出来的。休眠速度快吗?我在对数据库有大量查询的系统中使用它。并且性能变得警觉。 和当前背景下的其他问题。什么会更好 - 许多简单的查询(带有单个表)或带有多个 JOIN 的少一点查询?

提前准备的坦克 阿尔乔姆

【问题讨论】:

标签: java performance hibernate


【解决方案1】:

根据我们的经验,Hibernate 可以非常快。但是,可能存在许多特定于 ORM 工具的缺陷,包括:

  • 不正确的延迟加载,选择的数据过多或过少
  • N+1 选择问题,其中迭代集合很慢
  • 应避免使用List 的集合,而应优先使用Set,因此表中不需要包含订购信息
  • 最好退回到直接 SQL 的批处理操作

Hibernate 文档中的Improving Performance 页面是开始了解这些问题和其他提高性能的方法的好地方。

【讨论】:

    【解决方案2】:

    首先,您可以做很多事情来加速 Hibernate。查看这些High-Performance Hibernate Tips 文章,了解您可以采取哪些措施来加快数据访问层的速度。

    对于“许多”查询,您会遇到典型的N+1 query problem。您使用 Hibernate 加载具有相关对象的实体。使用 LAZY 联接,您将获得每条记录的单个查询。每个查询都通过网络到达您的数据库服务器,并返回数据。这一切都需要时间(打开连接、网络延迟、查找、数据吞吐量等)。

    对于单个查询(使用连接),查找和数据吞吐量大于使用多个查询。但是您只会打开一次连接和网络延迟。因此,对于 100 个或更多查询,您的查找和数据吞吐量很小,但您将拥有 100 次(包括打开连接和网络延迟)。

    一个耗时 20 毫秒的查询。 vs 100 个需要 1 毫秒的查询。?你做数学;)

    如果它可以增长到 1000 条记录。单个查询对性能的影响很小,但是 1000 次查询与 100 次查询相比要多 10 倍。因此,对于多个查询,您将大大降低性能。

    当使用 HQL 查询检索数据时,您可以add FETCH to a JOIN 以使用相同的查询(使用 JOIN)加载数据。

    有关此主题的更多信息,请查看此Hibernate Performance Tuning 教程。

    【讨论】:

      【解决方案3】:

      休眠可以很快。设计一个好的模式、调整你的查询并获得好的性能是一种艺术形式。请记住,无论如何,在幕后它都是 sql,所以你可以用 sql 做的任何事情都可以用 hibernate 做。

      通常在高级应用程序中,休眠映射/模式只是编写持久层的第一步。该步骤为您提供了很多功能。但下一步是使用 hql 编写自定义查询,让您只获取所需的数据。

      【讨论】:

        【解决方案4】:

        是的,它可以很快。 在过去,当人们认为“aaaa 这是这个愚蠢的 ORM 扼杀了我们优秀应用程序的所有性能”时,我遇到了几个案例 在分析后的所有情况下,我们都发现了问题的其他原因。 (集合的哈希码实现错误,来自地狱的正则表达式,mad hatter 等制作的数据库设计)

        实际上它可以在大多数常见情况下完成这项工作。如果您迁移庞大而复杂的数据——它将成为简单优化的 SQL 的糟糕竞争对手(但我希望不是你的情况——我个人非常讨厌数据迁移:)

        【讨论】:

          【解决方案5】:

          这不是关于它的第一个问题,但我在以前的问题中找不到合适的答案(可能是另一个“论坛”)。所以,我会再回答一次:-)

          我喜欢以一种有点挑衅的方式来回答这个问题(不是针对个人的!):你认为你能找到比 Hibernate 更好的解决方案吗?这不仅涉及基本问题,例如将数据库列映射到 Java 属性和“急切或延迟加载”(这是您问题的一个实际问题),还涉及缓存(1L 和 2L)、连接池、字节码增强、批处理, ...

          也就是说,Hibernate 是一个复杂的软件,需要一些学习才能正确使用和微调它。所以,我想说花时间学习 Hibernate 比编写自己的 ORM 更好。

          【讨论】:

          • 谢谢。您已经说服我毫无疑问地使用 Hibernate :) 为什么我会怀疑。我预计一张表的记录将超过 1 亿条,并在一秒钟内(大约)从其中 200 个查询。而且它只有一张表用于输入数据。在项目要求中 - 1 秒从服务器响应。并且关于每个操作必要的登录到数据库。这就是为什么我真的怀疑 Hibernate。
          • Hibernate 处理 SQL 查询的能力并不让我担心。如果生成的 SQL 不满意,您始终可以使用“本机”SQL 查询。最大的担忧是创建 SessionFactory。如果您使用的是应用程序服务器,或者您只为一千次操作打开一次会话,则应该没问题。
          【解决方案6】:

          如果您知道如何以这种方式使用 Hibernate,那么它的速度可能会很快。但是,polepos.org 性能测试表明,对于 Hibernate 而言,应用程序可能会减慢几个数量级。

          如果你想要更轻更快的ORM,我可以推荐fjorm

          【讨论】:

            【解决方案7】:

            ... 这将有很大的数量 查询数据库...

            如果您仍处于设计/开发阶段,请不要优化预防性。

            Hibernate 是一款制作精良的软件,请注意性能问题。当您的项目更成熟时,我会告诉您,可以解决性能问题并在必要时分析直接 JDBC 使用情况。

            【讨论】:

              【解决方案8】:

              它通常足够快,并且可以比基于 JDBC 的自定义解决方案更快。但作为所有工具,您必须正确使用它。

              快速并不意味着什么。您必须定义最大响应时间、最小吞吐量等,然后衡量解决方案是否满足要求,如果不满足要求,则调整应用程序以满足它们。

              关于连接与多个查询,这完全取决于。通常,连接显然更快,因为它们只需要一次进程间/网络往返。

              【讨论】:

                猜你喜欢
                • 2013-06-13
                • 1970-01-01
                • 2013-05-20
                • 2010-10-03
                • 1970-01-01
                • 2019-03-28
                • 2016-12-06
                • 1970-01-01
                相关资源
                最近更新 更多