如何阻止Objectify返回缓存值?

时间:2013-03-25 04:30:16

标签: objectify

我正在用Objectify保存一个像这样的对象:

Thing th = new Thing();
th.identifier = thingId;
th.name = thingName;
th.json = thingData;
ofy().save().entity(thing);
pResponse.setStatus(200);
pResponse.getWriter().println("OK");

我使用GAE数据存储浏览器验证数据库中的值已更新。我在当地跑步。然后我加载所有这样的东西:

Map<String, List<Thing>> responseJsonMap = new HashMap<String, List<Thing>>();
List<Thing> things = ofy().load().type(Thing.class).list();         
responseJsonMap.put("things", things);
pResponse.setContentType("application/json");
try {
    GSON.toJson(responseJsonMap, pResponse.getWriter());
} ...

我得到的是保存之前存在的数据。我试过在实体上关闭缓存并调用ofy().clear()但是都不起作用。如果我重新启动服务器或等待足够长的时间,保存的数据就会通过。我还尝试在保存后添加.now(),但没有必要,因为我可以在数据存储区中验证操作已完成。我真的希望能够加载我刚刚保存的数据。我做错了什么?

2 个答案:

答案 0 :(得分:5)

我做错了不是阅读手册而忘记了一步。

  

Objectify需要一个过滤器来清理任何线程本地事务   保留在最后的上下文和挂起的异步操作   一个要求。将其添加到您的WEB-INF / web.xml:

<filter>
     <filter-name>ObjectifyFilter</filter-name>
     <filter-class>com.googlecode.objectify.ObjectifyFilter</filter-class>
</filter>
<filter-mapping>
     <filter-name>ObjectifyFilter</filter-name>
     <url-pattern>/*</url-pattern> 
</filter-mapping>

好的,检查一下你是否收到了你真正不想要的缓存值。

答案 1 :(得分:0)

除了ObjectifyFilter问题之外,您最有可能看到的是数据存储区中查询的最终一致性。

请参阅:https://developers.google.com/appengine/docs/java/datastore/structuring_for_strong_consistency