Вопрос

Поддерживает ли SQLAlchemy какое-то кэширование, поэтому, если я повторно запускаю один и тот же запрос, он возвращает ответ из кеша вместо запроса к базе данных?Этот кеш автоматически очищается при обновлении БД?

Или как лучше всего реализовать это в настройке 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

Другие советы

Не ответ на ваш второй вопрос, но из комментариев по этой ссылке видно, что 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 поддерживает два типа кешей:

  1. Кэширование набора результатов, чтобы повторное выполнение одного и того же запроса попадало в кеш, а не в базу данных.Оно использует dogpile который поддерживает множество различных бэкэндов, в том числе memcached, redis, и базовые плоские файлы.

    Документы здесь: http://docs.sqlalchemy.org/en/latest/orm/examples.html#module-examples.dogpile_caching

  2. Кэширование query объект, чтобы интерпретатору Python не приходилось каждый раз заново собирать строку запроса вручную.Эти запросы называются baked queries и кэш называется baked.По сути, он кэширует все действия sqlalchemy требуется ДО обращения к базе данных - это не сокращает количество вызовов базы данных.Первоначальные тесты показывают ускорение до 40% в query время генерации за счет небольшого увеличения детализации кода.

    Документы здесь: http://docs.sqlalchemy.org/en/latest/orm/extensions/baked.html

Или используйте кеш уровня приложения через словари слабых ссылок (weakref.WeakValueDictionary), см. пример здесь: http://www.sqlalchemy.org/trac/wiki/UsageRecipes/UniqueObject

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top