我正在用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()
,但没有必要,因为我可以在数据存储区中验证操作已完成。我真的希望能够加载我刚刚保存的数据。我做错了什么?
答案 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