2008-10-15 11 views
21

Est-ce que SQLAlchemy prend en charge une sorte de mise en cache, donc si je répète plusieurs fois la même requête, elle renvoie la réponse du cache au lieu d'interroger la base de données? Ce cache est-il effacé automatiquement lorsque la base de données est mise à jour?SQLAlchemy prend-il en charge la mise en cache?

Ou quelle est la meilleure façon de l'implémenter sur une installation CherryPy + SQLAlchemy?

Répondre

41

Nous avons une solution de mise en cache assez complet, à titre d'exemple, en liaison avec des crochets intégrés, dans 0,6 . C'est une recette pour sous-classer Query, le rendre conscient de Beaker, et permettre le contrôle de la mise en cache des requêtes pour les requêtes explicites ainsi que les chargeurs paresseux via les options de requête.

Je l'utilise maintenant en production. L'exemple lui-même est dans le dist et la documentation d'intro est au http://www.sqlalchemy.org/docs/orm/examples.html#beaker-caching.

MISE À JOUR: Beaker a été remplacé par dogpile mise en cache: http://docs.sqlalchemy.org/en/latest/orm/examples.html#module-examples.dogpile_caching

14

Pas une réponse à votre deuxième question, mais des commentaires dans ce lien indique que SQLAlchemy ne supporte pas en tant que cache: http://spyced.blogspot.com/2007/01/why-sqlalchemy-impresses-me.html

Raven dit ...

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 a dit ...

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

Ce lien suggère http://www.mail-archive.com/[email protected]/msg15667.html/montre que la requête suivante n'utilise pas query mais renvoie l'instance à partir de la carte d'identité, mais cela ne fonctionne que si vous interrogez en utilisant la clé primaire. – andho

-4

Non, mais vous pouvez effectuer une mise en cache avec memcache.

3

SQLAlchemy supporte deux types de caches:

  1. Mise en cache le résultat réglé de telle sorte que à plusieurs reprises en cours d'exécution de la même requête touche le cache au lieu de la base de données. Il utilise dogpile qui prend en charge de nombreux backends différents, y compris memcached, redis, et les fichiers plats de base.

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

  2. l'objet Mise en cache query de sorte que l'interpréteur Python n'a pas à ré-assembler manuellement la chaîne de requête à chaque fois. Ces requêtes sont appelées baked queries et le cache est appelé baked. Fondamentalement, il met en cache toutes les actions sqlalchemy prend AVANT de frapper la base de données - il ne réduit pas les appels de base de données. Les benchmarks initiaux montrent des accélérations allant jusqu'à 40% en query temps de génération au compromis d'une légère augmentation de la verbosité du code.

    Docs sont ici: http://docs.sqlalchemy.org/en/latest/orm/extensions/baked.html