【问题标题】:Hibernate performance in terms of reads and writes在读取和写入方面的休眠性能
【发布时间】:2012-08-05 09:45:30
【问题描述】:

hibernate 在读写方面是如何工作的:

  1. 如果应用程序对 DB 进行更多写入,休眠如何工作? 在这种情况下,我知道每次写入都必须刷新缓存,除此之外是任何性能开销(与 JDBC 相比)

  2. 如果应用程序只读取数据(非常少的写入/更新),休眠如何工作? 在这种情况下,由于不需要刷新缓存,我们是否可以期望 hibernate 的性能与 JDBC 一样好(或更好)(如果调整得当)。

另外,想了解在 case2 中使用的最佳选项(ORM 除外)。

【问题讨论】:

  • 您要使用二级缓存吗?例如 EHCache?这很重要。
  • 是的,我们也可以使用level2 chache。但是,现在我想了解一般的表现。并且想了解在 case2 中使用 ORM 是否会出现重大性能问题?

标签: java performance hibernate database-performance cpu-cache


【解决方案1】:

Hibernate 是一个可以让开发变得更容易的工具。我觉得(根据我自己的经验)Hibernate 开销不是很大。您可能最终会编写自己的 sql 结果到对象映射。如果你做得好,它可能会比 Hibernate 快一点。然而:

  • Hibernate 在会话中进行 L1 缓存,因此您无需记住是否从 DB 获取数据
  • Hibernate 性能调整比 JDBC 容易得多 - 只需将 Javamelody 插入实时应用程序并查找最慢的 SQL,然后使用急切和延迟加载来加快速度。无需 SQL 重写,也无需接触映射代码。你只需要调整一些注释
  • L2 缓存非常简单。有时数据库缓存可以解决问题,但它有其局限性。在 Hibernate 中,您可以启用关系缓存​​和查询缓存。当您的数据库成为瓶颈并且您的应用程序部署在多个节点上时,您会看到差异。分布式缓存将比访问数据库数千次要快得多。

总而言之,是的,Hibernate 有其开销,但对我来说,调整功能非常重要,在复杂的应用程序中,使用 Hibernate 比使用普通 JDBC 有可能(并且很有可能)具有更好的性能。我不需要说使用 Hibernate 和 QueryDSL 开发比使用普通 JDBC 快得多。

【讨论】:

    【解决方案2】:

    添加额外的层总是会降低性能。然而,这个额外的层有时也会减少开发时间。因此,这一切都取决于您的用例和性能要求。如果您使用 ORM,那么您可以为读取和查询启用二级缓存,这就是您的应用程序级性能。但有时本地数据库缓存就足够了(这样集群中的每个节点都可以避免缓存)。

    【讨论】:

      猜你喜欢
      • 2011-03-02
      • 2010-09-20
      • 2017-01-02
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-11
      • 1970-01-01
      相关资源
      最近更新 更多