2012-04-05 10 views
3

i eine einfache FrageGAE-Caching-Abfragen objektivieren

in der objektivieren Dokumentation haben, sagt es, dass "nur get(),() gesetzt und löschen() mit dem Cache interagieren. Query() wird nicht im Cache gespeichert" http://code.google.com/p/objectify-appengine/wiki/IntroductionToObjectify#Global_Cache.

Was ich mich wundere - wenn Sie eine root-Entität haben (ich habe @Parent wegen all der Skalierbarkeitsprobleme nicht verwendet, die es zu haben scheint), dass alle anderen Entitäten einen Schlüssel zu haben, und Sie eine Abfrage durchführen wie

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

ist dies die vollständige Umgehung des Cache?

Wenn dies der Fall ist, ist es eine effiziente Caching Möglichkeit, eine Abfrage über die Bedingungen zu tun - oder was das betrifft können Sie eine Abfrage mit einem Elternteil Cache, in dem Sie eine tatsächliche Vorfahre Abfrage wie die folgenden

machen müssen würden
Key<Parent> rootKey = ObjectifyService.factory().getKey(root) 
ofy.query(ChildEntity.class).ancestor(rootKey) 

Danke


als einem der folgenden Erläuterungen ich eine Änderung hinzugefügt haben

Probe dao (die Validate-Methode ignorieren - es ist gerade tut einige null & Menge Prüfungen):

dies eine Probe alle Verfahren innerhalb eines Delegierten aus dem DAO, dass ich die Anfrage Fabrik Servicelocator verwendet

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

jetzt, wenn dieser ausgeführt genannt finden wird feststellen, dass folgende Methode wird tatsächlich in meinem AbstractDAO aufgerufen.

Antwort

6

Ja, alle Abfragen umgehen das integrierte Memcache von Objektify und holen Ergebnisse direkt aus dem Datenspeicher. Der Datenspeicher bietet die (zunehmend ausgeklügelte) Abfrage-Engine, die versteht, wie Ergebnisse zurückgegeben werden. Das Bestimmen der Cache-Invalidierung für Abfrageergebnisse ist von der Clientseite ziemlich unmöglich.

Auf der anderen Seite bietet Objectify4 einen hybriden Abfrage-Cache, bei dem Abfragen automatisch in eine Nur-Schlüssel-Abfrage gefolgt von einer Batch-Abfrage konvertiert werden. Die Nur-Schlüssel-Abfrage benötigt immer noch den Datenspeicher, aber alle Entitätsinstanzen werden aus dem Memcache gezogen (und bei Fehlversuchen aufgefüllt). Es könnte dir Geld sparen.

+0

während des Debuggen bemerkte ich, dass, wenn ich eine Abfrage mache - die Find-Methode wird tatsächlich aufgerufen - meine Methode ist einfach ofy.begin(). Find (clazz, id) - da dies ist hinter den Kulissen ist dies Ziehen Sie eine zwischengespeicherte Entität oder gehen Sie direkt zum Datenspeicher, da dieser von einer Abfrage aufgerufen wurde? Dies war in der Dokumentation - "Eine Abfrage() wird zwischengespeicherte Entitätsinstanzen zurückgeben, der (möglicherweise teure) Aufruf an den Datenspeicher wird jedoch weiterhin ausgeführt." - Ich frage mich, was das eigentlich bedeutet? Vielen Dank für die Hilfe –

+0

Objectify.find() ist eine get-by-key keine Abfrage. Der einzige Unterschied zwischen find() und get() besteht darin, dass find() null zurückgibt und get() eine Ausnahme auslöst, wenn die Entität nicht existiert. – stickfigure

+0

Sorry - ich muss es falsch formuliert haben - wenn ich meine findAll-Methode, die 'ofy.query (Type.class) .filter (Filter.class)' verwendet, ich erwarte, dass dies den Cache umgehen - aber ich finde es dann geht zu meiner find-Methode (die in meinem lcoator - die einfach ofy.find ist (Type.class, id)) - das Dokument sagt, dass die Abfrage den Cache umgeht, aber die Abfrage, die ich rufe, scheint meine Methode find zu verwenden - und Ich denke, dass Find den Cache technisch treffen sollte, da es get() hinter den Kulissen verwendet. Klingt das richtig - ich könnte weit weg sein?Ich werde den Code in einer Bearbeitung wirklich schnell posten - danke nochmal –