gpt4 book ai didi

java - Ehcache - 为什么条目这么大?

转载 作者:行者123 更新时间:2023-11-30 05:00:35 25 4
gpt4 key购买 nike

我有一个相当简单的数据模型,例如:

class MyParent {
// 7 fields here, some numeric, some String, not longer than 50 chars total
Set<MyChild> children;
}

class MyChild {
int ownerId;
// 3 more fields, numeric or dates
}

MyParentMyChildMyParent.children 均以只读方式缓存。

我有 40,000 个 MyParent 实例和 100,000 个 MyChild 实例。这会在缓存中产生 180,000 个条目(如果添加 40,000 个 MyParent.children)。

我想缓存所有内容,按 ownerId 分组。不想重新发明轮子,我想使用查询缓存,例如:

Query query = session
.createQuery(
"select distinct p from MyParent p join fetch p.children c where c.ownerId = :ownerId");
query.setParameter("ownerId", ownerId);
query.setCacheable(true);
query.setCacheRegion("MyRegion");
query.list();

对于 ownerId 的所有 1,500 个值。

缓存可以工作,但我注意到它很大!使用 Ehcache.calculateInMemorySize() 测量,平均每个条目都超过 1 KB 大。为了缓存大约 180,000 个条目,我需要超过 200 MB。鉴于条目本身要小得多,这太离谱了。

开销从何而来?如何减少开销?

最佳答案

我不确定您使用什么缓存来进行数学计算,但让我使用 MyParent 类作为示例。鉴于您对该类的解释,在启用了compressedOops的64位VM上,MyParent实例在堆中的大小将略低于500字节。这还是在没有 Set 的情况下,稍后我会解释原因(否则顶部会多出 128 个字节)。缓存还需要保存该条目的 key ,该 key 会添加到计算中......

Hibernate 不直接使用主键(它存储在缓存中的键),而是使用 CacheKey 条目。该实例保存该值所代表的实体的 pk 以及其他四个字段:type、Hibernate 类型映射; entityOrRoleName,实体或集合角色名称; tenantId,与此数据关联的租户标识符;最后是 pk 的 hashCode(参见 org.hibernate.type.Type.getHashCode)。

现在遗憾的是,这一切并没有结束,该条目的值不是 MyParent 实例,而是 CacheEntry 实例。这次,除了更多元数据(subClass,实体的名称,默认为 FQCN;lazyPropertiesAreUnfetched, boolean 值;以及实体外的 optimisitc 锁定值)之外,该实例仍然不保存 MyParent 实例,而是保存它。该表示形式是实体状态(所有属性)的数组。

我想有了这些信息,您的 hibernate 缓存的“估计”大小将更有意义。我想强调的是,这些只是估计值,如果我没记错的话,它可能略高于实际情况。事实上,例如 CacheKey 中的某些信息可能应该以不同的方式进行解释。从 Ehcache 2.5 开始,您将能够在缓存上启用基于内存的调整(甚至在 CacheManager 级别)。完成此操作后,将精确测量缓存条目,并且calculateInMemorySize()将为您提供实际测量的缓存大小。

您现在可以从 ehcache.org 下载 2.5 的测试版。另请注意,在缓存上使用基于字节的大小调整时,大小调整引擎将考虑 Hibernate 缓存类型中的缓存条目之间的这些共享实例。您可以在此处阅读有关这一切工作方式的更多信息:http://ehcache.org/documentation/configuration.html#Memory_Based_Cache_Sizing_Ehcache_2.5_and_higher

希望能帮助您更好地理解这一切......亚历克斯

关于java - Ehcache - 为什么条目这么大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6844578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com