Проблема в кэшировании второго уровня + Spring Boot + Java Hibernate - PullRequest
0 голосов
/ 17 января 2019

Добавлено следующее в pom.xml:

<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache</artifactId>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-ehcache</artifactId>
</dependency>

Затем, следуя в хранилище клиентов

@Cacheable(cacheNames="customer", key="#email")
@Query(value = "select company_name from  customer  where email =?1", nativeQuery = true)
List<String> getUserByEmailID(String emailID);

В файле app.prop указано следующее:

spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.use_query_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
spring.jpa.properties.javax.persistence.sharedCache.mode=ALL

Добавлено следующее в сущности клиента:

@Cacheable
@org.hibernate.annotations.Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITE)
@Table(name = "customer")
public class Customer implements Serializable {

..}

Код, для которого требуется кэширование:

List<String> ibCustomers = customerRepository.getUserByEmailID("XXX@abc.com");

Моя цель - внедрить кэширование второго уровня с запросом, что означает, что при повторном создании одного и того же запроса запрос не должен выполняться. Прямо сейчас запрос запускается всегда, хотя я дал одно и то же письмо, так как каждый раз вижу это в журнале:

org.hibernate.SQL                        : 
    /* dynamic native SQL query */ select
        company_name 
    from
        customer  
    where
        email =?

Что я делаю не так?

1 Ответ

0 голосов
/ 17 января 2019

Вы можете использовать или JPA-кэширование (я думаю, @Cacheable связано с JPA) или Hibernate, поэтому вы должны рассмотреть 2 сценария.

Сценарий JPA

В случае JPA: согласно спецификации JPA, чтобы включить кэширование JPA (это @Cacheable аннотация JPA?), Вы должны указать <shared-cache-mode> в своем persistence.xml

Например:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0">
  <persistence-unit name="SimpleTest" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
    <properties>
    </properties>
  </persistence-unit>
</persistence>

Сценарий гибернации

В случае использования кэширования в спящем режиме вы должны использовать аннотацию @Cache, предоставленную Hibernate ( Hibernate @ Cache )

Более того, если вы используете спящий объект Quibernate, вы должны указать, что запрос должен кэшироваться, выполнив что-то вроде этого:

Query q = hibSession.createQuery(....);
q.setCacheable(true);

Вы можете найти больше здесь https://www.baeldung.com/hibernate-second-level-cache

Надеюсь, это полезно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...