40 Stimmen

Unterstützt SQLAlchemy Caching?

Unterstützt SQLAlchemy irgendeine Art von Zwischenspeicherung, so dass, wenn ich wiederholt die gleiche Abfrage ausführen es die Antwort aus dem Cache zurückgibt, anstatt die Datenbank abzufragen? Wird dieser Cache automatisch geleert, wenn die DB aktualisiert wird?

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

57voto

zzzeek Punkte 66340

Wir haben eine ziemlich umfassende Caching-Lösung, als Beispiel in Verbindung mit eingebetteten Hooks, in 0.6. Es ist ein Rezept für die Unterklasse Query, das Beaker kennt und die Steuerung des Query-Caching für explizite Abfragen und Lazy Loader über Query-Optionen ermöglicht.

Ich setze es jetzt in der Produktion ein. Das Beispiel selbst ist in der Dist und die Intro-Dokumentation ist unter http://www.sqlalchemy.org/docs/orm/examples.html#beaker-caching .

UPDATE: Beaker wurde jetzt ersetzt durch dogpile Zwischenspeicherung: http://docs.sqlalchemy.org/en/latest/orm/examples.html#module-examples.dogpile_caching

19voto

Jeff Widman Punkte 19168

SQLAlchemy unterstützt zwei Arten von Caches:

  1. Zwischenspeichern der Ergebnismenge, so dass die wiederholte Ausführung derselben Abfrage auf den Cache statt auf die Datenbank trifft. Es verwendet dogpile das viele verschiedene Backends unterstützt, darunter memcached , redis und einfache flache Dateien.

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

  2. Zwischenspeichern der query Objekt, so dass der Python-Interpreter die Abfragezeichenfolge nicht jedes Mal manuell neu zusammensetzen muss. Diese Abfragen werden als baked queries und der Cache heißt baked . Grundsätzlich werden alle Aktionen zwischengespeichert sqlalchemy braucht, BEVOR er auf die Datenbank zugreift - es reduziert nicht die Datenbankaufrufe. Erste Benchmarks zeigen Geschwindigkeitssteigerungen von bis zu 40% in query Generierungszeit auf Kosten eines leichten Anstiegs der Ausführlichkeit des Codes.

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

18voto

torial Punkte 13003

Nicht eine Antwort auf Ihre zweite Frage, aber aus den Kommentaren in diesem Link zeigt, dass SQLAlchemy nicht unterstützt Caching : 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.

5voto

ychaouche Punkte 4541

Oder verwenden Sie einen Cache auf Anwendungsebene über weak references dicts (weakref.WeakValueDictionary), ein Beispiel finden Sie hier: http://www.sqlalchemy.org/trac/wiki/UsageRecipes/UniqueObject

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X