Кэширование данных

Dec 21, 2010 08:26

Так как частота изменений или константность данных в SQL словаре в целом известна, то мы можем существенно оптимизировать работу слоя доступа к данных. Под оптимизацией я подразумеваю не только ускорение доступа к элементам словаря, но и уменьшение нагрузки на СУБД.

Оптимизация реализуется за счет кэширования объектов некоторых классов на уровне слоя доступа. Другими словами, C++ код грамматического словаря, обслуживающий запросы на загрузку из базы данных, в некоторых случаях запоминает единожды загруженные объекты в своих списках. Повторный запрос на загрузку тех же объектов выполняется уже без обращения к БД.

Разумеется, СУБД продолжает при этим кэшировать данные на своем уровне.

Некоторые особенности кэша слоя доступа:

1. Идентификация объектов  осуществляется на основе естественного признака каждого объекта - первичного ключа.

2. Объекты в кэше не синхронизируются с базой данных. Поэтому в случае изменения в БД закэшированных данных необходимо перезапустить клиентское приложение. При проектировании слоя доступа была идея ввести специальную процедуру - сброс кэшей, но пока я от нее отказался, так как необходимость в такой операции будет очень редкой. В аналогичном механизме поисковой системы при работе с описаниями индексных баз движок постоянно отслеживает метки последней модификации данных в БД, и при необходимости сам "на ходу" подгружает изменившиеся данные. Поэтому поисковая система допускает в принципе одновременную работу двух движков на одном хосте - они будут корректно синхронизироваться.

3. В кэше нет механизмов устаревания объектов.

4. Кэш многопоточный, с блокировками потоков по классам объектов.

5. Кэшируются следующие объекты: языки, части речи, грамматические атрибуты, словарные статьи.

6. Вообще не кэшируются следующие объекты: фразы и их компоненты; связи, их теги и флаги; N-грамы.

(Немного расширенный вариант статьи на сайте ...)

SQL словарь, процедурный API

Previous post Next post
Up