SQLAlchemy はある種のキャッシュをサポートしているので、同じクエリを繰り返し実行すると、データベースをクエリする代わりにキャッシュからの応答が返されますか? DBが更新されると、このキャッシュは自動的にクリアされますか?
それとも、CherryPy + SQLAlchemy セットアップでこれを実装する最良の方法は何ですか?
SQLAlchemy はある種のキャッシュをサポートしているので、同じクエリを繰り返し実行すると、データベースをクエリする代わりにキャッシュからの応答が返されますか? DBが更新されると、このキャッシュは自動的にクリアされますか?
それとも、CherryPy + SQLAlchemy セットアップでこれを実装する最良の方法は何ですか?
例として、組み込みフックと組み合わせた 0.6 の非常に包括的なキャッシング ソリューションがあります。これは、Query をサブクラス化し、Beaker を認識させ、明示的なクエリのクエリ キャッシュとクエリ オプションを介した遅延ローダーを制御できるようにするためのレシピです。
現在、本番環境で実行しています。サンプル自体はディストリビューションにあり、イントロ ドキュメントは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
は、コードの冗長性がわずかに増加する代わりに、生成時間で最大 40% のスピードアップが示されています。
ドキュメントはこちら: http://docs.sqlalchemy.org/en/latest/orm/extensions/baked.html
または、弱い参照辞書 (weakref.WeakValueDictionary) を介してアプリケーション レベルのキャッシュを使用します。ここで例を参照してください: http://www.sqlalchemy.org/trac/wiki/UsageRecipes/UniqueObject