Статьи

Включение Entity и Query cache в Hibernate

1. Введение

Среди задач, связанных с производительностью, которые я прошел, это была одна из них. Проблема заключается в том, что если один и тот же запрос вызывается каждый раз для конкретной сущности, а данные таблицы не подлежат изменению для определенного временного интервала, мы можем кэшировать результаты запроса с помощью Hibernate. Это означает, что, если нам нужны данные об Студенте с идентификатором 1234, запрос выполняется и обращается к базе данных только для первого запроса. Последующие запросы обслуживаются с результатами из кэша запросов. Это сильно влияет на время отклика, которое мы могли заметить. Когда мы делаем это, мы также беспокоимся о том, когда кеш обновляется. Мы можем сделать это легко с помощью простой конфигурации, которую мы будем изучать.

Если кеш запросов применяется, то последующий оператор SQL не отправляется в базу данных. Результаты запроса извлекаются из кэша запросов, а затем идентификаторы кэшированных объектов используются для доступа к кэшу второго уровня.

2. Реализация

Чтобы включить кэш запросов, ниже приведен набор шагов, которые необходимо выполнить:

  1. Установите для свойства hibernate.cache.use_query_cache значение true и убедитесь, что кэш второго уровня включен. Перейдите по этой ссылке, чтобы понять кэш второго уровня.
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <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>
  2. После этого org.hibernate.cache.internal.StandardQueryCache содержит результаты кэшированных запросов.
  3. В файле конфигурации ehCache добавьте приведенный ниже фрагмент кода —
    1
    2
    3
    4
    5
    6
    <cache name="org.hibernate.cache.StandardQueryCache"
        maxElementsInMemory="10000"
        eternal="false"
        timeToLiveSeconds="86400"
        overflowToDisk="false"
        memoryStoreEvictionPolicy="LRU" />
  4. Кэш запросов не кэширует состояние реальных объектов в кеше. Он кэширует значения идентификатора и результаты типа значения. Поэтому всегда используйте кеш запросов в сочетании с кешем второго уровня для тех объектов, которые должны кэшироваться как часть кеша результатов запросаhttps://docs.jboss.org/hibernate/orm/4.0/devguide/en- США / html / ch06.html
  5. Чтобы кэшировать соответствующий объект, как указано в пункте 4, нам нужно добавить следующий фрагмент в файл отображения объекта XML как —
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    <?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>

    Вышеуказанное гарантирует, что не ленивые компоненты сущности кэшируются как часть кеша результатов запроса.

  6. После того, как все вышеперечисленные пункты были рассмотрены, последний момент заключается в том, чтобы явно включить кэширование запросов для отдельных запросов, как —
    1
    2
    3
    Query query = session.createQuery("FROM EMPLOYEE");
    query.setCacheable(true);
    List users = query.list();

После всего этого, возможно, вы сможете запустить свой сервер в режиме отладки и увидеть, как происходит волшебство!

Ссылка: Включение кеша Entity и Query в Hibernate от нашего партнера JCG Абхиманью Прасада в блоге jCombat .