Кэширование в Liferay

Кэширование в Liferay достаточно хорошо продуманно и охватывает все уровни портала. На рисунке 1 можно увидеть схему механизмов кэширования. В качестве отправной точки для ознакомления в коде можно выбрать класс PortalContextLoaderListener, в котором происходит инициализация и очистка различных кэшей.

Рис. 1 Схема работы кэширования в портале Liferay

В данной статье хотелось бы подробнее рассмотреть самый нижний уровень кэширования — Finder, Entity и Hibernate. В персистентном слое портал использует Hibernate и его кэши первого и второго уровня. Первый уровень кэширования используется для хранения объектов, полученных в течение текущей сессии базы данных. В данном случае имеется в виду, что при вызове какого-нибудь сервисного метода будет стартовать сессия базы данных и проживёт до возвращения результатов. За это время все полученные объекты будут храниться в кэше первого уровня. Второй уровень кэширования Hibernate позволяет хранить объекты (Entity Cache) и результаты запросов (Query Cache). Если, например, делается выборка по всем пользователям организации, то сами объекты будут храниться в Entity Cache, а ссылки на них в Query Cache. Кроме кэширования Hibernate Liferay имеет свои Entity и Query(Finder) кэши. На них остановимся подробнее. Весь код по работе этих двух кэшей находится в сгенеренном сервис-билдером классе YourEntityNamePersistenceImpl. В случае с Entity кэшом всё достаточно просто — во всех CRUD операциях в сгенерённом классе существуют соответствующие операции с кэшом. Например:

Test test = (Test)EntityCacheUtil.getResult(TestModelImpl.ENTITY_CACHE_ENABLED, TestImpl.class, testId);

 

или

EntityCacheUtil.putResult(TestModelImpl.ENTITY_CACHE_ENABLED,TestImpl.class, testId, _nullTest);

 

Реализацию EntityCache можно подсмотреть в классе EntityCacheImpl. Для непосредственного хранения используется 2 механизма — ThreadLocal по принципу LRU и портальный кэш (по умолчанию Ehcache). Этот тип кэша хранит сами объекты, в отличие от Finder кэша. Этот хранит ссылки на primaryKey как ссылку на объект(Object primaryKey = _resultToPrimaryKey(result)). Посмотреть реализацию можно, открыв FinderCacheImpl класс. Принцип работы Finder кэша заключается в сохранении ссылок на объекты в зависимости от поисковых критериев (можно посмотреть в классе FinderPath). При обновлении сущности обновлять или не обновлять определённый Finder кэш определяется по битмаске (if ((testModelImpl.getColumnBitmask() & FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID.getColumnBitmask()) != 0)). Конечное сохранение в этом кэше точно так же построенно по локальному и портальному механизму, как и для EntityCache. Есть возможность отключения кэширования для сущностей и файндеров:

value.object.entity.cache.enabled.com.liferay.portal.model.User=false
value.object.finder.cache.enabled.com.liferay.portal.model.User=false

   В грядущей версии портала 6.2 кэширование на уровне запросов будет настолько усовершенствовано, что позволит отключить кэш второго уровня Hibernate.

 

Ссылки на источники.

1. http://www.liferay.com/en/web/jorge.ferrer/blog/-/blogs/liferay-s-architecture-caching-part-1-

2. http://marksweep.blogspot.ru/2011/11/liferay-caching.html