Поддерживает ли SQLAlchemy какое-то кеширование, поэтому, если я повторно запускаю один и тот же запрос, он возвращает ответ из кеша вместо запроса базы данных? Этот кеш автоматически очищается при обновлении БД?
Или как лучше всего реализовать это в настройке CherryPy + SQLAlchemy?
Не ответ на ваш второй вопрос, но из комментариев в этой ссылке видно, что 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.
Или используйте кеш уровня приложения с помощью dicts слабых ссылок (weakref.WeakValueDictionary), см. Пример здесь: http://www.sqlalchemy.org/trac/wiki/UsageRecipes/UniqueObject
У нас есть довольно комплексное решение для кеширования, например, в сочетании со встроенными хуками в версии 0.6. Это рецепт создания подкласса Query, чтобы он знал о Beaker и позволял управлять кэшированием запросов для явных запросов, а также для ленивых загрузчиков с помощью параметров запроса.
Сейчас я запускаю его в производство. Сам пример находится в dist, а вводная документация - на http://www.sqlalchemy.org/docs/orm/examples.html#beaker-caching.
ОБНОВЛЕНИЕ: Beaker теперь заменен кешированием dogpile
: http://docs.sqlalchemy.org/en/latest/orm/examples.html#module-examples.dogpile_caching
SQLAlchemy поддерживает два типа кешей:
Кэширование набора результатов, чтобы многократно выполняемый один и тот же запрос попадал в кеш, а не в базу данных. Он использует dogpile
, который поддерживает множество различных серверных программ, включая memcached
, redis
и базовые плоские файлы.
Документы здесь: http://docs.sqlalchemy.org/en/latest/orm/examples.html#module-examples.dogpile_caching
Кэширование объекта query
, чтобы интерпретатору Python не приходилось каждый раз вручную заново собирать строку запроса. Эти запросы называются baked queries
, а кэш - baked
. По сути, он кэширует все действия, которые sqlalchemy
выполняет ПЕРЕД обращением к базе данных - он не сокращает количество обращений к базе данных. Первоначальные тесты показывают ускорение до 40% времени генерации query
за счет небольшого увеличения детализации кода.
Документы здесь: http://docs.sqlalchemy.org/en/latest/orm/extensions/baked.html
Кэширование набора результатов не использует карту идентификации? Я впервые услышал о собачьей куче в этом контексте. Или это как-то связано с картой идентичности?
Эта ссылка mail-archive.com/[email protected]/msg15667.html предполагает / показывает, что последующий запрос не использует запрос, а возвращает экземпляр из карты идентичности, но это работает только в том случае, если вы запрашиваете с использованием первичного ключа.