1

Java のリモート API を介してデータストアの全体を更新しています。

アプリ エンジン ダッシュボードで更新されたエントリを照会すると、新しいバージョンを確認できます。しかし、更新前に実行されていて、既にデータストア エントリを読み取ったインスタンスで実行されている私のサーブレットには、まだ古いバージョンが表示されます。

インスタンスを手動でシャットダウンし、新しいインスタンスが起動すると、新しいバージョンが問題なく提供されます。App Engine ダッシュボードを介してデータストアからエントリを削除すると、古い実行中のインスタンスが期待どおりにエントリを読み取ることができなくなります。

これは、実行中のインスタンスのキャッシングの問題のようです。リモート API が実行中のインスタンスに、特定のデータストア エントリをキャッシュできなくなったことを通知できていないようです。

リモート API でこれを変更するためにできることはありますか? それとも、バグを報告する必要がありますか?

注: memcache またはインスタンスの RAM には何もキャッシュしていません。

更新 これは、リモート API を介して新しいエンティティを更新する方法です。

DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
Entity entity = new Entity("DocModel", "somekey");
entity.setProperty("html", "someProperty");
ds.put(entity);

これは、JDO を使用してサーブレットで値を読み取る方法です。

PersistenceManager pm = PMF.get().getPersistenceManager();
DocModel docModel = pm.getObjectById(DocModel.class, "someKey");

JDO クラスは次のとおりです。

@PersistenceCapable
public class DocModel {
  @PrimaryKey
  @Persistent
  private String name;

  @Persistent
  private Text html;

  public DocModel(String path, String html) {
    this.name = path;
    this.html = new Text(html);
  }

  public String getHtml() {
    return html.getValue();
  }

  public String getPath() {
    return name;
  }
}

Update2

これはJDO関連のようです。データストア API を使用するように読み取りを変更したところ、更新された値が表示されるようになりました。JDO では、これらの更新された値は表示されません (数回、約 10 分間テストしました)。値を伝播するには、インスタンスを強制終了する必要があります。

4

3 に答える 3

1

一貫性の問題のように思えます (エントリのキャッシュがないことを 100% 確信している場合 / PMF が進行中の場合)。

JDO が強い整合性を使用していることは確かですか? 経由で強制的に設定できます

Query q = pm.newQuery(DocModel.class);
q.addExtension("datanucleus.appengine.datastoreReadConsistency", "STRONG");

私見 JDO はデフォルトで強い一貫性を使用します (jdoconfig.xml で指定されているように) が、jdoconfig.xml を再確認します)。

更新: 強い一貫性は JDO のデフォルトではありません (ドキュメントに記載されているにもかかわらず) => したがって、表示されている内容は理にかなっており、一貫性を STRONG に設定すると問題が解決する可能性があります ( https://code.google.com/p/ googleappengine/issues/detail?id=6326 )。

于 2013-05-06T11:14:21.290 に答える
1

これは結果整合性であり、クエリで最新の書き込みをすべて確実に確認したい場合は、祖先クエリを実行する必要があります

于 2013-05-06T12:16:55.173 に答える