2

我正在使用 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()在保存后添加,但这不是必需的,因为我可以在数据存储中验证操作已完成。我真的很想能够加载我刚刚保存的数据。我究竟做错了什么?

4

2 回答 2

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>

好吧,检查一下你是否得到了你真的没想到的缓存值。

于 2013-03-25T05:04:17.857 回答
0

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

看到这个: https ://developers.google.com/appengine/docs/java/datastore/structuring_for_strong_consistency

于 2013-03-25T14:09:59.500 回答