SQLAlchemyはある種のキャッシュをサポートしているので、同じクエリを繰り返し実行すると、データベースにクエリを実行する代わりに、キャッシュからの応答が返されますか? DBが更新されると、このキャッシュは自動的にクリアされますか?
または、CherryPy + SQLAlchemyセットアップでこれを実装するための最良の方法は何ですか?
0.6には、埋め込みフックと組み合わせた例として、かなり包括的なキャッシュソリューションがあります。これは、クエリをサブクラス化し、ビーカーを認識させ、クエリオプションを介して明示的なクエリとレイジーローダーのクエリキャッシュを制御できるようにするためのレシピです。
現在、本番環境で実行しています。例自体はdistにあり、イントロドキュメントは http://www.sqlalchemy.org/docs/orm/examples.html#beaker-caching にあります。
更新:ビーカーはdogpile
キャッシングに置き換えられました: http://docs.sqlalchemy.org/en/latest/orm/examples.html#module-examples.dogpile_caching
2番目の質問への回答ではありませんが、このリンクのコメントから、SQLAlchemyがキャッシュをサポートしていないことがわかります: http://spyced.blogspot.com/2007/01/why-sqlalchemy-impresses-me.html
レイヴンは言った...
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
ジョナサンエリスは言った...
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.
SQLAlchemyは、次の2種類のキャッシュをサポートしています。
同じクエリを繰り返し実行するとデータベースではなくキャッシュにヒットするように結果セットをキャッシュします。 dogpile
、memcached
、基本的なフラットファイルなど、さまざまなバックエンドをサポートするredis
を使用します。
ドキュメントはここにあります: http://docs.sqlalchemy.org/en/latest/orm/examples.html#module-examples.dogpile_caching
query
オブジェクトをキャッシュして、Pythonインタープリターがクエリ文字列を毎回手動で再構築する必要がないようにします。これらのクエリはbaked queries
と呼ばれ、キャッシュはbaked
と呼ばれます。基本的には、データベースにアクセスする前にsqlalchemy
が実行するすべてのアクションをキャッシュします。データベース呼び出しは削減されません。初期ベンチマークでは、query
コードの冗長性のわずかな増加とのトレードオフでの生成時間。
ドキュメントはここにあります: http://docs.sqlalchemy.org/en/latest/orm/extensions/baked.html
または、弱参照dict(weakref.WeakValueDictionary)を介してアプリケーションレベルのキャッシュを使用します。ここで例を参照してください: http://www.sqlalchemy.org/trac/wiki/UsageRecipes/UniqueObject