0

我有一个问题,每当我加载父实体(User在我的情况下)并将其放入缓存时,它的所有子实体(在拥有关系中)也会被缓存。

如果我没记错的话,解释很简单:序列化过程涉及对象的所有属性,这导致所有子对象也被获取。最终,整个实体组被获取。

我该如何避免呢?用户实体组计划包含相当多的信息,我不想一次全部缓存。更不用说一次获取所有子对象真的很费力。

我遇到了transient修饰符并高兴了一段时间,直到我意识到,它不仅可以阻止某些字段被缓存,还可以阻止这些字段变得持久。

4

1 回答 1

0

所以答案是使用实体的分离版本。我使用一个现在看起来像这样的函数加载所有实体:

@SuppressWarnings("unchecked")
E cachedEntity = (E) cache.get(cacheKey);

if (cachedEntity != null) {
    entity = cachedEntity;          
}
else {
    entity = pm.getObjectById(Eclass, key);
    cache.put(cacheKey, pm.detachCopy(entity));
}

缺点是,当我想获取子对象时,我必须显式附加实体,使用entity = pm.makePersistent(entity)它生成Datastore.GETRPC。然而,这不会经常发生,而且很可能我只想访问实体本身,而不是它的子对象,因此它非常有效。

我遇到了一个更好的解决方案。附加实体时存在一个 RPC 调用,因为 JDO 检查实体是否真的存在于数据存储中。根据DataNucleus文档,只需在 PMF 中设置datanucleus.attachSameDatastore为即可将其关闭。false但是它对我不起作用,Datastore.GET在附加对象时总是被调用。如果它有效,我可以在从缓存中以零成本获取它之后隐式附加每个对象,并且我不必在需要时手动执行它。

于 2012-08-21T11:44:04.350 回答