36

SQLAlchemy はある種のキャッシュをサポートしているので、同じクエリを繰り返し実行すると、データベースをクエリする代わりにキャッシュからの応答が返されますか? DBが更新されると、このキャッシュは自動的にクリアされますか?

それとも、CherryPy + SQLAlchemy セットアップでこれを実装する最良の方法は何ですか?

4

4 に答える 4

55

例として、組み込みフックと組み合わせた 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

于 2010-01-28T03:43:08.180 に答える
17

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.
于 2008-10-24T03:16:05.867 に答える
13

SQLAlchemy は、次の 2 種類のキャッシュをサポートしています。

  1. 同じクエリを繰り返し実行すると、データベースではなくキャッシュにヒットするように結果セットをキャッシュします。、 、基本的なフラット ファイルなど、dogpileさまざまなバックエンドをサポートする を使用します。memcachedredis

    ドキュメントはこちら: http://docs.sqlalchemy.org/en/latest/orm/examples.html#module-examples.dogpile_caching

  2. queryPython インタープリターが毎回手動でクエリ文字列を再構築する必要がないように、オブジェクトをキャッシュします。これらのクエリが呼び出されbaked queries、キャッシュが呼び出されbakedます。基本的に、データベースにアクセスする前に実行するすべてのアクションsqlalchemyをキャッシュします。データベース呼び出しを削減しません。最初のベンチマークでqueryは、コードの冗長性がわずかに増加する代わりに、生成時間で最大 40% のスピードアップが示されています。

    ドキュメントはこちら: http://docs.sqlalchemy.org/en/latest/orm/extensions/baked.html

于 2015-11-02T18:35:59.530 に答える
5

または、弱い参照辞書 (weakref.WeakValueDictionary) を介してアプリケーション レベルのキャッシュを使用します。ここで例を参照してください: http://www.sqlalchemy.org/trac/wiki/UsageRecipes/UniqueObject

于 2009-11-21T19:37:15.280 に答える