1. Введение
Среди задач, связанных с производительностью, которые я прошел, это была одна из них. Проблема заключается в том, что если один и тот же запрос вызывается каждый раз для конкретной сущности, а данные таблицы не подлежат изменению для определенного временного интервала, мы можем кэшировать результаты запроса с помощью Hibernate. Это означает, что, если нам нужны данные об Студенте с идентификатором 1234, запрос выполняется и обращается к базе данных только для первого запроса. Последующие запросы обслуживаются с результатами из кэша запросов. Это сильно влияет на время отклика, которое мы могли заметить. Когда мы делаем это, мы также беспокоимся о том, когда кеш обновляется. Мы можем сделать это легко с помощью простой конфигурации, которую мы будем изучать.
Если кеш запросов применяется, то последующий оператор SQL не отправляется в базу данных. Результаты запроса извлекаются из кэша запросов, а затем идентификаторы кэшированных объектов используются для доступа к кэшу второго уровня.
2. Реализация
Чтобы включить кэш запросов, ниже приведен набор шагов, которые необходимо выполнить:
- Установите для свойства hibernate.cache.use_query_cache значение true и убедитесь, что кэш второго уровня включен. Перейдите по этой ссылке, чтобы понять кэш второго уровня.
0102030405060708091011121314151617181920
<beanid="sessionFactory"class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"><propertyname="dataSource"ref="dataSource"/><propertyname="hibernateProperties"><props><propkey="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop><propkey="hibernate.show_sql">true</prop><!-- Enable second level cache --><propkey="hibernate.cache.use_second_level_cache">true</prop><propkey="hibernate.cache.use_query_cache">true</prop><propkey="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop><propkey="net.sf.ehcache.configurationResourceName">/ehCache.xml</prop></props></property><propertyname="mappingResources"><list><value>User.hbm.xml</value></list></property></bean> - После этого org.hibernate.cache.internal.StandardQueryCache содержит результаты кэшированных запросов.
- В файле конфигурации ehCache добавьте приведенный ниже фрагмент кода —
123456
<cachename="org.hibernate.cache.StandardQueryCache"maxElementsInMemory="10000"eternal="false"timeToLiveSeconds="86400"overflowToDisk="false"memoryStoreEvictionPolicy="LRU"/> - Кэш запросов не кэширует состояние реальных объектов в кеше. Он кэширует значения идентификатора и результаты типа значения. Поэтому всегда используйте кеш запросов в сочетании с кешем второго уровня для тех объектов, которые должны кэшироваться как часть кеша результатов запроса — https://docs.jboss.org/hibernate/orm/4.0/devguide/en- США / html / ch06.html
- Чтобы кэшировать соответствующий объект, как указано в пункте 4, нам нужно добавить следующий фрагмент в файл отображения объекта XML как —
010203040506070809101112131415
<?xmlversion="1.0"encoding="utf-8"?><!DOCTYPEhibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD//EN"<hibernate-mapping><classname="Employee"table="EMPLOYEE"><cacheusage="transactional"include="non-lazy"/><idname="id"type="int"column="ID"><generatorclass="native"/></id><propertyname="firstName"column="FNAME"type="string"/><propertyname="lastName"column="LNAME"type="string"/></class></hibernate-mapping>Вышеуказанное гарантирует, что не ленивые компоненты сущности кэшируются как часть кеша результатов запроса.
- После того, как все вышеперечисленные пункты были рассмотрены, последний момент заключается в том, чтобы явно включить кэширование запросов для отдельных запросов, как —
123
Query query = session.createQuery("FROM EMPLOYEE");query.setCacheable(true);List users = query.list();
После всего этого, возможно, вы сможете запустить свой сервер в режиме отладки и увидеть, как происходит волшебство!
| Ссылка: | Включение кеша Entity и Query в Hibernate от нашего партнера JCG Абхиманью Прасада в блоге jCombat . |