1. Введение
Среди задач, связанных с производительностью, которые я прошел, это была одна из них. Проблема заключается в том, что если один и тот же запрос вызывается каждый раз для конкретной сущности, а данные таблицы не подлежат изменению для определенного временного интервала, мы можем кэшировать результаты запроса с помощью Hibernate. Это означает, что, если нам нужны данные об Студенте с идентификатором 1234, запрос выполняется и обращается к базе данных только для первого запроса. Последующие запросы обслуживаются с результатами из кэша запросов. Это сильно влияет на время отклика, которое мы могли заметить. Когда мы делаем это, мы также беспокоимся о том, когда кеш обновляется. Мы можем сделать это легко с помощью простой конфигурации, которую мы будем изучать.
Если кеш запросов применяется, то последующий оператор SQL не отправляется в базу данных. Результаты запроса извлекаются из кэша запросов, а затем идентификаторы кэшированных объектов используются для доступа к кэшу второго уровня.
2. Реализация
Чтобы включить кэш запросов, ниже приведен набор шагов, которые необходимо выполнить:
- Установите для свойства hibernate.cache.use_query_cache значение true и убедитесь, что кэш второго уровня включен. Перейдите по этой ссылке, чтобы понять кэш второго уровня.
0102030405060708091011121314151617181920
<
bean
id
=
"sessionFactory"
class
=
"org.springframework.orm.hibernate4.LocalSessionFactoryBean"
>
<
property
name
=
"dataSource"
ref
=
"dataSource"
/>
<
property
name
=
"hibernateProperties"
>
<
props
>
<
prop
key
=
"hibernate.dialect"
>org.hibernate.dialect.MySQLDialect</
prop
>
<
prop
key
=
"hibernate.show_sql"
>true</
prop
>
<!-- Enable second level cache -->
<
prop
key
=
"hibernate.cache.use_second_level_cache"
>true</
prop
>
<
prop
key
=
"hibernate.cache.use_query_cache"
>true</
prop
>
<
prop
key
=
"hibernate.cache.region.factory_class"
>org.hibernate.cache.ehcache.EhCacheRegionFactory</
prop
>
<
prop
key
=
"net.sf.ehcache.configurationResourceName"
>/ehCache.xml</
prop
>
</
props
>
</
property
>
<
property
name
=
"mappingResources"
>
<
list
>
<
value
>User.hbm.xml</
value
>
</
list
>
</
property
>
</
bean
>
- После этого org.hibernate.cache.internal.StandardQueryCache содержит результаты кэшированных запросов.
- В файле конфигурации ehCache добавьте приведенный ниже фрагмент кода —
123456
<
cache
name
=
"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
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<!
DOCTYPE
hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
<
hibernate-mapping
>
<
class
name
=
"Employee"
table
=
"EMPLOYEE"
>
<
cache
usage
=
"transactional"
include
=
"non-lazy"
/>
<
id
name
=
"id"
type
=
"int"
column
=
"ID"
>
<
generator
class
=
"native"
/>
</
id
>
<
property
name
=
"firstName"
column
=
"FNAME"
type
=
"string"
/>
<
property
name
=
"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 . |