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 に答える