sea*_*ste 3 gwt google-app-engine objectify
我有一个简单的问题
在objectify文档中,它说"只有get(),put()和delete()与缓存交互.query()没有缓存" http://code.google.com/p/objectify-appengine/wiki/IntroductionToObjectify#Global_Cache.
我想知道的 - 如果你有一个根实体(由于所有可扩展性问题,我没有使用@Parent),所有其他实体都有一个Key,你做了一个查询,如
ofy.query(ChildEntity.class).filter("rootEntity", rootEntity).list()
Run Code Online (Sandbox Code Playgroud)
这是完全绕过缓存?
如果是这种情况,是否有一种有效的缓存方式来对条件进行查询 - 或者就此而言,您可以使用父级缓存查询,您必须在其中创建一个实际的祖先查询,如下所示
Key<Parent> rootKey = ObjectifyService.factory().getKey(root)
ofy.query(ChildEntity.class).ancestor(rootKey)
Run Code Online (Sandbox Code Playgroud)
谢谢
至于下面的评论之一,我添加了一个编辑
sample dao(忽略validate方法 - 它只进行一些null和数量检查):
这是一个示例查找请求工厂ServiceLocator正在使用的DAO调用的委托内的所有方法
public List<EquipmentCheckin> findAll(Subject subject, Objectify ofy, Event event) {
final Business business = (Business) subject.getSession().getAttribute(BUSINESS_ATTRIBUTE);
final List<EquipmentCheckin> checkins = ofy.query(EquipmentCheckin.class).filter(BUSINESS_ATTRIBUTE, business)
.filter(EVENT_CONDITION, event).list();
return validate(ofy, checkins);
}
Run Code Online (Sandbox Code Playgroud)
现在,当执行此操作时,我发现在AbstractDAO中实际调用了以下方法.
/**
*
* @param id
* @return
*/
public T find(Long id) {
System.out.println("finding " + clazz.getSimpleName() + " id = " + id);
return ObjectifyService.begin().find(clazz, id);
}
Run Code Online (Sandbox Code Playgroud)
是的,所有查询都绕过Objectify的集成内存缓存并直接从数据存储区获取结果.数据存储区提供了(越来越复杂的)查询引擎,该引擎了解如何返回结果; 从客户端来看,确定查询结果的缓存失效几乎是不可能的.
另一方面,Objectify4确实提供了一个混合查询缓存,从而将查询自动转换为仅密钥查询,然后是批量获取.仅密钥查询仍然需要数据存储区,但是任何实体实例都从memcache中拉出(并填充).它可能会省钱.
| 归档时间: |
|
| 查看次数: |
1674 次 |
| 最近记录: |