2008-10-15 18 views
21

Czy SQLAlchemy obsługuje pewien rodzaj buforowania, więc jeśli wielokrotnie uruchamiam to samo zapytanie, zwraca odpowiedź z pamięci podręcznej, zamiast kwerendy do bazy danych? Czy ta pamięć podręczna jest automatycznie czyszczona po zaktualizowaniu bazy danych?Czy SQLAlchemy obsługuje buforowanie?

Albo jaki jest najlepszy sposób wdrożenia tego w konfiguracji CherryPy + SQLAlchemy?

Odpowiedz

41

Mamy dość kompleksowe rozwiązanie buforowania, jako przykład w połączeniu z wbudowanymi hakami, w 0,6 . Jest to przepis na podklasę Query, uświadomienie Beakerowi i umożliwienie kontroli buforowania zapytań dla jawnych zapytań, a także leniwych ładowarek za pomocą opcji zapytań.

Używam go teraz do produkcji. Sam przykład znajduje się w instrukcji dist, a dokumentacja wstępna to http://www.sqlalchemy.org/docs/orm/examples.html#beaker-caching.

UPDATE: Zlewka został obecnie zastąpiony dogpile buforowania: http://docs.sqlalchemy.org/en/latest/orm/examples.html#module-examples.dogpile_caching

14

Nie odpowiedzią na drugie pytanie, ale z uwagi na ten link wskazuje, że SQLAlchemy nie obsługuje cache'owanie: http://spyced.blogspot.com/2007/01/why-sqlalchemy-impresses-me.html

Raven powiedział ...

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 powiedział ...

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

Ten link http://www.mail-archive.com/[email protected]/msg15667.html sugeruje/wskazuje, że kolejna kwerenda nie używa zapytanie, ale zwraca instancję z mapy tożsamości, ale działa to tylko w przypadku kwerendy za pomocą klucza podstawowego. – andho

-4

Nie, ale można wykonać buforowanie z memcache.

3

SQLAlchemy obsługuje dwa rodzaje pamięci podręcznej:

  1. buforowanie wynik ustawiony tak, że wielokrotnie uruchamiając samego zapytania uderza cache zamiast baza danych. Używa ona dogpile, która obsługuje wiele różnych baz danych, w tym memcached, redis i podstawowe pliki płaskie.

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

  2. buforowanie obiektu query tak że interpreter Pythona nie musi ręcznie ponownie zmontować ciągu kwerendy za każdym razem. Te zapytania są nazywane baked queries, a pamięć podręczna nazywa się baked. Zasadniczo buforuje wszystkie akcje, które sqlalchemy robi PRZED uderzeniem bazy danych - nie redukuje wywołań bazy danych. Początkowe testy porównawcze pokazują przyspieszenia do 40% w czasie generowania query przy niewielkim wzroście poziomu szczegółowości kodu.

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