【问题标题】:Hibernate cache vs Map - Storage purpose休眠缓存与地图 - 存储目的
【发布时间】:2016-01-05 21:50:57
【问题描述】:

假设我有一张表,其中 Master Data 播种了 1 次,并且很少更新。它有一个扁平的结构实体,不像Lazy attributes

Address{
     id,
     country,
     state,
     city,
     pincode,
     area
}

案例-1:表有1000条记录

案例 2:表有 100 万条记录

用例 - 需要通过 id 获取完整的 Address object。此表中的事务没有更新,仅用于显示目的,LOV's,reference Id 等。

  1. 考虑性能、内存使用、GC、搜索速度等,哪个更好使用 Hibernate 缓存(id, object) 或仅使用 static HashMap (is as key, Address object as value)

  2. 我知道Hibernate 2nd level cacheehcache,Infinispan 等)也在库的深处使用 Map 结构。那么它是否在上述情况下添加了任何有用的东西,以添加额外的 Hibernate 层。

【问题讨论】:

  • 你是指第一级的hibernate缓存吗?
  • @kucing_terbang 不,它纯粹是 2 级缓存与主题中的 hashmap,没有 Ist 级别
  • 那么我会选择使用休眠缓存(ehcache 等)。除非你为 JVM 保留了巨大的内存。
  • @ kucing_terbang 是的,所以我想知道 Hibernate 是如何管理对象的,而不是存储在内存中..??,在这种情况下它如何存储 id 和 object 以及在哪里,它纯粹是在磁盘上。
  • 是的,hibernate 会将它存储到内存中,直到事务结束(它将数据写入数据库/磁盘并清理缓存/内存)。您的情况应该与最后的处理相同,Address 只是休眠的另一个实体。

标签: java hibernate dictionary ehcache second-level-cache


【解决方案1】:

Ehcache 、Hazelcast(用于二级缓存) 等比静态 Hashmap 具有更多功能。

1.限制内存中元素的最大数量

2.溢出到磁盘(如果超过上述数量)

3.为元素设置生存时间和空闲时间

4.允许在集群内复制

如果您想要这些功能,那么您应该这样做。否则静态哈希图可以完成您的工作。如果您的记录得到更新,请在一段时间后刷新。

还有一件事,在这两种情况下,数据都将存储在内存中,或者您可以说是在堆上。但如果你想存储数据OFF Heap,那么请阅读MapDB

我曾作为二级缓存提供者从事 hazelcast 工作。它也提供分布式缓存,并且在集群环境中运行良好。

检查这些链接 Disk based HashMap Ehcache Vs Static map cache implementation

【讨论】:

  • 但是使用 ``MapDb 从磁盘读取可能是一个开销。意思是在内存中讨论并且有足够的内存,HashMap 可以更好。
  • 是的,你是对的。如果您不想要 ehcache 提供的所有这些缓存功能,那就更好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
  • 2015-01-05
  • 2011-11-18
  • 2017-01-16
相关资源
最近更新 更多