2008-10-15 9 views
21

Unterstützt SQLAlchemy eine Art von Caching, wenn ich also dieselbe Abfrage wiederholt ausfühle, gibt es die Antwort aus dem Cache zurück, anstatt die Datenbank abzufragen? Wird dieser Cache automatisch gelöscht, wenn die Datenbank aktualisiert wird?Unterstützt SQLAlchemy Caching?

Oder was ist der beste Weg, dies auf einem CherryPy + SQLAlchemy-Setup zu implementieren?

Antwort

41

Wir haben eine ziemlich umfassende Caching-Lösung, als ein Beispiel in Verbindung mit eingebetteten Haken, in 0,6 . Es ist ein Rezept, um die Abfrage abzuleiten, auf Beaker aufmerksam zu machen und die Kontrolle des Abfrage-Cachings für explizite Abfragen sowie von Lazy Loadern über Abfrageoptionen zu ermöglichen.

Ich führe es jetzt in der Produktion. Das Beispiel selbst befindet sich in der Ferne und die Intro-Dokumentation befindet sich unter http://www.sqlalchemy.org/docs/orm/examples.html#beaker-caching.

UPDATE: Becher wurde nun mit dogpile Caching ersetzt worden: http://docs.sqlalchemy.org/en/latest/orm/examples.html#module-examples.dogpile_caching

14

keine Antwort auf Ihre zweite Frage, sondern aus den Kommentaren in diesem Link gibt an, dass SQLAlchemy nicht Cachen unterstützt: http://spyced.blogspot.com/2007/01/why-sqlalchemy-impresses-me.html

Raven sagte ...

Does SQLAlchemy do any kind of internal caching? 

For example, if you ask for the same data twice (or an obvious subset 
of the initially requested data) will the database be hit once or twice? 

I recently wrote a caching database abstraction layer for an 
application and (while fun) it was a fair bit of work to get it to a 
minimally functional state. If SQLAlchemy did that I would seriously 
consider jumping on the bandwagon. 

I've found things in the docs that imply something like this might be 
going on, but nothing explicit. 
4:36 PM 

Jonathan Ellis sagte ...

No; the author of SA [rightly, IMO] considers caching a separate concern. 

What you saw in the docs is probably the SA identity map, which makes it so 
if you load an instance in two different places, they will refer 
to the same object. But the database will still be queried twice, so it is 
not a cache in the sense you mean. 
+2

Dieser Link http://www.mail-archive.com/[email protected]/msg15667.html schlägt/zeigt, dass die nachfolgende Abfrage verwendet nicht ein Abfrage aber gibt die Instanz aus der Identitätskarte zurück, aber das funktioniert nur, wenn Sie mit dem Primärschlüssel abfragen. – andho

-4

Nein, aber Sie können Caching mit Memcache durchführen.

3

SQLAlchemy zwei Arten von Caches unterstützt:

  1. das Ergebnis gesetzt Caching, so dass immer wieder die gleiche Abfrage ausgeführt trifft den Cache statt die Datenbank. Es verwendet dogpile, die viele verschiedene Backends unterstützt, einschließlich memcached, redis und einfache Flat-Dateien.

    Docs sind hier: http://docs.sqlalchemy.org/en/latest/orm/examples.html#module-examples.dogpile_caching

  2. Caching das query Objekt, so dass Python-Interpreter des Query-String nicht jedes Mal manuell wieder zusammenbauen müssen. Diese Abfragen heißen und der Cache heißt baked. Im Grunde speichert es alle Aktionen, die sqlalchemy VOR dem Aufrufen der Datenbank durchführt - es reduziert nicht Datenbankaufrufe. Anfängliche Benchmarks zeigen eine Beschleunigung von bis zu 40% in query Generationszeit bei einem leichten Anstieg der Code-Ausführlichkeit.

    Docs sind hier: http://docs.sqlalchemy.org/en/latest/orm/extensions/baked.html