3

簡単な質問があります

objectify のドキュメントでは、「get()、put()、および delete() のみがキャッシュと対話します。query() はキャッシュされません」と書かれています http://code.google.com/p/objectify-appengine/wiki /イントロダクションToObjectify#Global_Cache .

私が疑問に思っていること-ルートエンティティが1つあり(スケーラビリティの問題があると思われるため、@Parentを使用しなかった)、他のすべてのエンティティにキーがあり、次のようなクエリを実行する場合

ofy.query(ChildEntity.class).filter("rootEntity", rootEntity).list()

これはキャッシュを完全にバイパスしていますか?

この場合、条件に基づいてクエリを実行する効率的なキャッシュ方法はありますか? または、次のような実際の祖先クエリを作成する必要がある親でクエリをキャッシュできますか?

Key<Parent> rootKey = ObjectifyService.factory().getKey(root)
ofy.query(ChildEntity.class).ancestor(rootKey)

ありがとうございました


以下のコメントの1つについて、編集を追加しました

サンプル dao (validate メソッドは無視してください。null と数量のチェックを行うだけです):

これは、リクエスト ファクトリ ServiceLocator が使用している DAO から呼び出されるデリゲート内の find all メソッドのサンプルです。

public List<EquipmentCheckin> findAll(Subject subject, Objectify ofy, Event event) {
  final Business business = (Business) subject.getSession().getAttribute(BUSINESS_ATTRIBUTE);
  final List<EquipmentCheckin> checkins = ofy.query(EquipmentCheckin.class).filter(BUSINESS_ATTRIBUTE, business)
    .filter(EVENT_CONDITION, event).list();
  return validate(ofy, checkins);
}

これを実行すると、AbstractDAO で次のメソッドが実際に呼び出されていることがわかります。

/**
* 
* @param id
* @return
*/
public T find(Long id) {
  System.out.println("finding " + clazz.getSimpleName() + " id = " + id);
  return ObjectifyService.begin().find(clazz, id);
}
4

1 に答える 1

6

はい、すべてのクエリはObjectifyの統合されたmemcacheをバイパスし、データストアから直接結果をフェッチします。データストアは、結果を返す方法を理解する(ますます洗練された)クエリエンジンを提供します。クエリ結果のキャッシュ無効化を判断することは、クライアント側からはほとんど不可能です。

一方、Objectify4はハイブリッドクエリキャッシュを提供します。これにより、クエリは自動的にキーのみのクエリに変換され、その後にバッチ取得が続きます。キーのみのクエリには引き続きデータストアが必要ですが、エンティティインスタンスはすべてmemcacheからプルされます(ミス時に入力されます)。それはあなたにお金を節約するかもしれません。

于 2012-04-05T03:59:33.400 に答える