Hibernate性能

我有疑问,也许是某人看来是愚蠢的。 Hibernate快吗? 我在系统中使用它,它对数据库的查询数量非常大。 并且性能变得警觉。 关于当前背景的其他问题。 什么会更好 – 许多简单的查询(使用单个表)或少几个JOIN查询?

提前Artem的坦克

首先,你可以做很多事情来加速Hibernate。 查看这些高性能hibernate提示文章,了解可以加快数据访问层速度的全面列表。

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

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

单个查询需要20ms。 vs 100个需要1ms的查询。? 你做数学;)

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

使用HQL查询检索数据时,可以将FETCH添加到JOIN ,以便使用相同的查询加载数据(使用JOIN)。

有关此主题的更多信息,请查看此Hibernate性能调优教程。

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

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

Hibernate文档中的“ 改进性能”页面是开始了解这些问题以及其他提高性能的方法的好地方。

是的,它可以很快。 在过去我得到了几个案例,当人们认为“aaaa就是这个愚蠢的ORM杀死了我们所有应用程序的所有性能”时,在所有情况下,我们发现了问题的其他原因。 (收集的糟糕的哈希代码实现,地狱的regExps,疯帽子的db设计等)

实际上它可以在大多数常见情况下完成工作。 如果你迁移庞大而复杂的数据 – 那么普通的优化SQL将会是一个糟糕的竞争对手(但我希望不是你的情况 – 我个人讨厌热情的数据迁移:)

Hibernate 可以很快。 设计好的模式,调整查询和获得良好的性能是一种艺术forms。 请记住,无论如何,它的所有sql都覆盖了,所以你可以使用hibernate做的任何事情。

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

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

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

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

如果你知道如何以这种方式使用它,那么Hibernate可能是合理的。 然而, polepos.org性能测试表明,对于Hibernate来说,可能会使应用程序的速度降低几个数量级。

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

…对数据库的查询数量真的很大……

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

Hibernate是一个制作精良的软件,并且要注意性能问题。 我会告诉你,当你的项目进入性能问题时更成熟,并在必要时分析直接的JDBC使用情况。

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

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

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