【问题标题】:How much overhead do frameworks like Hibernate bring?像 Hibernate 这样的框架会带来多少开销?
【发布时间】:2010-03-03 09:57:54
【问题描述】:

开发人员有时会严厉批评多层企业 Web 应用程序...有些人认为“企业”是缓慢、臃肿和资源匮乏的代名词。

与编写自己的 DAO 或其他不太抽象的方法相比,Hibernate 之类的框架是否真的会对性能产生不小的影响?我认为问题是“用户是否注意到页面加载速度因此变慢”。

【问题讨论】:

  • 在这里滑冰接近主观性的边缘 ;-) 我会尝试改写。
  • 为什么是主观的?欢迎大家讨论指标,或者究竟是什么额外的代码框架引入。
  • 尖刻?...

标签: java performance hibernate web-applications orm


【解决方案1】:

如果使用得当,您可能会提高而不是降低性能。在大多数情况下,您将获得相当的性能,当出现问题时,您将有更多的时间进行故障排除。

PS 请记住在 Hibernate 中使用适当的工具,例如 Hibernate profiler。他们可以创造奇迹!

使用 Hibernate 的 PPS 不能替代了解您的 SQL!

【讨论】:

  • 赞成“使用 Hibernate 不能替代了解您的 SQL!”
【解决方案2】:

这实际上取决于您在做什么,或者更确切地说,取决于您如何使用该框架。此外,以今天的硬件功能,今天的问题可能在几个月内都不算数。

不知道你问这个是因为有一个应用程序要求说性能很重要,或者你只是想知道,但是考虑一下:有些人在应用程序中使用 Hibernate 并注意到它很慢。然后一些人用普通的 JDBC、iBatis 或其他任何东西对其进行了重构、优化,然后它运行了 faaaaast。所以,结论是:Hibernate 很慢。

但他们并不认为该技术被滥用。是的...很酷,你可以写 object.getX().getZ().getW().getSomeOtherThing().getEtc() 并且它可以正常工作,但是 Hibernate 会生成 SQL,天堂会帮助你。

在做任何事情之前,请考虑优化规则:

  • 优化的第一条规则 - 不要这样做 它。
  • 优化的第二条规则(针对专家) - 暂时不要这样做。

添加框架通常是一件好事,因为它简化了开发。如果它增加了开销?嗯……光看是看不出来的。您必须对其进行分析和测试。

【讨论】:

  • “以今天的硬件能力,今天的问题可能在几个月内都不算数”,这对于网络应用程序来说是一个可怕的论点。您的用户群爆炸速度可能远快于计算机的增长速度。
  • “你不能只看它就知道。你必须对其进行分析和测试”......是的,这就是这个问题的重点,我想有人可能已经这样做了:)
  • 如果您的用户群爆炸式增长,您使用 Hibernate、其他框架还是自定义框架是否重要?当您遇到性能问题时,您要做的第一件事就是投入更快的硬件。如果这没有帮助,您开始考虑在软件中进行哪些更改。如果我从 MySQL 切换到 Postgres 会有帮助吗?甲骨文呢?我是否应该开始剥离软件以从中获得最终的性能下降等等。所以基本上你会转而重新设计东西(如果你从第一天起就没有为此目的设计它 - 这就是你想要做的吗? )。
【解决方案3】:

我认为问题是“用户是否注意到页面加载速度变慢了”。

对于大多数 CRUD 应用程序,实际上恰恰相反。如果使用和调整得当,Hibernate 将生成比大多数开发人员更好的 SQL(很遗憾,但确实如此)以及延迟加载、一级缓存(事务级缓存)、二级缓存(全局级缓存)、查询等特性缓存将使其性能优于较低级别的方法(自定义 SQL 和 DAO)。

因为有人提到了批量更新和大型结果集,我要强调 Hibernate 有一个StatelessSession 用于这些用例。但我不认为它们在 webapp 的交互部分的范围内(如果您的搜索在 webapp 中检索到 10⁶ 记录,那么您做错了)。

【讨论】:

    【解决方案4】:

    这很大程度上取决于你在做什么。通常,您的用户不会注意到前端的差异,但有几点需要注意:

    • ORM 映射器不擅长批量更新或处理大型结果集。

    • 如果您有一组复杂的关系,您的 ORM 映射器可能会减慢速度,因为它确实以“错误”的方式连接。或者获取的数据过多。

    • 如果您的站点负载非常重,则额外的 CPU 周期可能会妨碍您,但这不太可能。

    ORM 映射器可以使您的软件更容易开发。密切关注性能并在直接 SQL 中完成 1% 的事情,但在其他 99% 的事情中保持 Hibernate。

    【讨论】:

      猜你喜欢
      • 2011-06-03
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      • 2015-04-28
      • 2011-07-25
      • 1970-01-01
      相关资源
      最近更新 更多