2012-04-05 12 views
3

クエリを客観それは「のみ、get()は()入れて、キャッシュとの対話)(削除します。query()はキャッシュされていない」と言う をhttp://code.google.com/p/objectify-appengine/wiki/IntroductionToObjectify#Global_CacheGAEのキャッシングは、私は客観ドキュメントに簡単な質問</p> <p>を持って

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

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

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

このような場合は、条件のクエリを実行するための効率的なキャッシュ方法がある - またはそのことについてあなたは以下の

のような実際の祖先クエリを作成しなければならない親とクエリをキャッシュすることができますそれだけでない -
Key<Parent> rootKey = ObjectifyService.factory().getKey(root) 
ofy.query(ChildEntity.class).ancestor(rootKey) 

は私が編集

サンプルDAO(validateメソッドを無視を追加しました以下のコメントの一つにとして


ありがとういくつかのヌル&量チェック):これが実行されたときは、このサンプルは、DAOから呼び出されたデリゲート内のすべての方法を見つけるさ

要求工場のServiceLocatorは現在

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); 
} 

答えて

6

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

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

+0

デバッグ中に私はクエリを実行するたびにfindメソッドが実際に呼び出されていることに気付きました。my findメソッドは単純にofy.begin()ですfind(clazz、id) - これはバックグラウンドを使用しているためですキャッシュされたエンティティを取得するか、クエリから呼び出されてからデータストアにまっすぐ進みますか?これはドキュメントにあります。「クエリ()はキャッシュされたエンティティインスタンスを返しますが、データストアへの(潜在的に高価な)呼び出しは引き続き行われます。 - 私はちょうどこれが実際に何を意味するのだろうかと思いますか?助けてくれてありがとう –

+0

Objectify.find()はクエリではなくキーの取得です。 find()とget()の唯一の違いは、find()がnullを返し、エンティティが存在しないときにget()が例外をスローすることです。 – stickfigure

+0

申し訳ありません - 私は実際に 'ofy.query(Type.class).filter(Filter.class)'を使用しているfindAllメソッドを実行すると間違っていると言わざるを得ないでしょう。 'キャッシュをバイパスすると期待していますが、 (私のlcoatorのもの - 単にofy.find(Type.class、id)である)に行く - docはキャッシュがバイパスされていると言っているが、私が呼び出すクエリはfindメソッドを使っているようだ - find()は舞台裏でget()を使用しているので、findは技術的にキャッシュに当てるべきだと思います。これは正しいと思いますか?私は途方もないかもしれませんか?私は本当に編集のコードを投稿します - ありがとうございました –

関連する問題