【问题标题】:Hibernate large collections performance problems despite using 2nd Level Cache尽管使用 2 级缓存,但 Hibernate 大型集合的性能问题
【发布时间】:2018-05-21 12:01:39
【问题描述】:

我们有一个包含 500.000 个子对象的父对象。我们使用 Hibernate 与 ehcache 作为缓存提供者进行映射。对实体和集合使用二级缓存效果很好,因为我们可以避免对数据库的请求。

但是通过二级缓存加载 500.000 个对象仍然会产生大量的 cpu 和内存垃圾,并导致几秒钟的响应时间。由于子对象不是不可变的,我们不能启用 hibernate.cache.use_reference_entries 属性。

在hibernate 2级缓存之上使用dao对象的应用层缓存,没有cpu和垃圾内存开销。响应时间是几毫秒而不是几秒。

但是这个解决方案的最大缺点是,我们必须自己管理这个缓存。包括集群多线程系统中的失效和同步。

我的问题是,是否有更好的解决方案,具有低 cpu 和垃圾的优点?有人有处理大型收藏的经验吗?

【问题讨论】:

    标签: performance hibernate caching collections


    【解决方案1】:

    你真的需要一次 500k 吗?

    您可以从 Parent 中删除集合并通过 parent 查询 Child 中的对象:SELECT c FROM Child c WHERE c.parent = :parent 并在您不需要一次 500k 时添加分页或过滤。

    您还可以将数据子实体加载为 DTO,这将提高内存性能,因为休眠不会考虑这些 DTO 进行脏检查。我想这会将内存占用减少一半,尽管我从未对其进行基准测试。此外,DTO 将允许您省略在此特定用例中不需要的属性,从而节省内存和 CPU。

    您还可以查看 Hibernate 5 中的 enableDirtyTracking。

    【讨论】:

      猜你喜欢
      • 2013-02-15
      • 1970-01-01
      • 2011-07-22
      • 2010-10-28
      • 1970-01-01
      • 2011-08-05
      • 2014-10-18
      • 2017-05-11
      • 2011-12-04
      相关资源
      最近更新 更多