programing

스프링 부트 + JPA2 + 휴지 상태 - 세컨드 레벨 캐시 활성화

cafebook 2023. 3. 9. 22:20
반응형

스프링 부트 + JPA2 + 휴지 상태 - 세컨드 레벨 캐시 활성화

Spring Boot 1.2.5와 JPA2를 함께 사용하여 엔티티에 주석을 붙이고 있습니다(그리고 JPA 구현의 밑바탕으로 휴지 상태).

이 설정에서 두 번째 수준의 캐시를 사용하고 싶었기 때문에 엔티티에는 다음과 같은 주석이 붙었습니다.@javax.persistence.Cacheable

application.properties에도 다음 내용을 추가했습니다.

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

기동시에 휴지 상태가 되어 있는 경우는, 다음과 같은 불편이 있습니다.EhCacheRegionFactory폼에도 이렇게 넣었어요

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

하지만 여전히 다음과 같은 질문을 합니다.entityManager.find(Clazz.class, pk)캐시된 데이터를 사용하는 대신 DB 쿼리를 실행합니다.

뭐가 빠졌는지 알아?

모든 항목(L2 캐시 및 쿼리 캐시)을 요약하면 다음과 같습니다.

먼저 캐시 공급자(EhCache 사용을 권장합니다)를 클래스 경로에 추가합니다.

휴지 상태 < 5 . 3

를 추가합니다.hibernate-ehcache의존.이 라이브러리에는 현재 중단된 EhCache 2가 포함되어 있습니다.

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-ehcache</artifactId>
    <version>your_hibernate_version</version>
</dependency>

휴지 상태 > = 5.3

새로운 버전의 Hibernate 캐시에서는 JSR-107(JCache) API를 구현해야 합니다.따라서 JSR-107 API용과 실제 JCache 구현용(EhCache 3)의 2가지 종속성이 필요합니다.

<dependency>
     <groupId>org.hibernate</groupId>
     <artifactId>hibernate-jcache</artifactId>
     <version>your_hibernate_version</version>
</dependency>

<dependency>
    <groupId>org.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>3.6.3</version>
    <scope>runtime</scope>
</dependency>

이제 application.properties/yml 파일로 넘어가겠습니다.

spring:
  jpa:
    #optional - show SQL statements in console. 
    show-sql: true 
    properties:
      javax:
        persistence:
          sharedCache: 
            #required - enable selective caching mode - only entities with @Cacheable annotation will use L2 cache.
            mode: ENABLE_SELECTIVE 
      hibernate:
        #optional - enable SQL statements formatting.
        format_sql: true 
        #optional - generate statistics to check if L2/query cache is actually being used.
        generate_statistics: true
        cache:
          #required - turn on L2 cache.
          use_second_level_cache: true
          #optional - turn on query cache.
          use_query_cache: true 
          region:
            #required - classpath to cache region factory.
            factory_class: org.hibernate.cache.ehcache.EhCacheRegionFactory 

EhCache 3(또는 휴지 상태 > = 5.3)의 경우 이 지역 출고지를 사용해야 합니다.

factory_class: org.hibernate.cache.jcache.JCacheRegionFactory

휴지 상태의 TRACE 레벨의 로깅을 유효하게 해, 코드와 설정을 확인할 수도 있습니다.

logging:
  level:
    org:
      hibernate:
        type: trace

이제 코드로 넘어갑시다.엔티티에서 L2 캐시를 활성화하려면 다음 두 개의 주석을 추가해야 합니다.

@javax.persistence.Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE) //Provide cache strategy.
public class MyEntity {
  ...
}

참고 - 캐시할 경우@OneToMany또는@ManyToOnerelation - 추가@Cache이 필드에도 주석을 달 수 있습니다.

또한 spring-data-jpa 저장소에서 쿼리 캐시를 활성화하려면 적절한 캐시를 추가해야 합니다.QueryHint.

public class MyEntityRepository implements JpaRepository<MyEntity, Long> {

  @QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"))
  List<MyEntity> findBySomething(String something);

}

이제 쿼리를 한 번만 실행했는지 로그를 통해 확인하고 모든 디버깅 정보를 꺼야 합니다. 이제 완료했습니다.

2 - 누락된 캐시 전략을 다음과 같이 정의할 수도 있습니다.create로그에 경고를 표시하지 않고 기본값을 유지하려면 다음 절차를 따릅니다.

spring:
  jpa:
    properties:
      hibernate:
        javax:
          cache:
            missing_cache_strategy: create

좀 더 파헤친 후에 내가 놓친 건application.properties:

spring.jpa.properties.javax.persistence.sharedCache.mode=ALL

누군가에게 도움이 되길 바랍니다:)

@Daimon 나는 잘 모르겠다.

spring.jpa.properties.javax.persistence.sharedCache.mode=ALL

최선의 결정입니다.

Hibernate 20.2.1에서 인용. 캐시 매핑 매뉴얼 섹션

기본적으로 엔티티는 두 번째 수준 캐시의 일부가 아니며 이 설정을 고수할 것을 권장합니다.단, persistence.xml 파일에 shared-cache-mode 요소를 설정하거나 javax.persistence를 사용하여 이를 덮어쓸 수 있습니다.구성의 sharedCache.mode 속성.

반면에.

ENABLE_SELECTIVE(기본값 및 권장값): 캐시 가능으로 명시적으로 표시되지 않는 한 엔티티는 캐시되지 않습니다.

따라서 영향을 받는 모든 엔티티 with@javax.per에 주석을 달지 않았을 수 있습니다.캐시 가능 또는 rather@org.hibernate.an 주석.캐시 ? 이로 인해 쿼리 캐시가 두 번째 수준 캐시에서 영향을 받는 엔티티를 검색하려고 했지만 성공하지 못한 후 한 번의 선택으로 각 엔티티를 가져오기 시작한 영향이 발생할 수 있습니다.

추가하셨나요?

@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_ONLY) 

캐시할 클래스에서 사용할 수 있습니까?

클래스 경로에 ehcache.xml 파일이 있어야 합니다.파일에는 적어도 기본 캐시 전략이 포함되어 있어야 합니다.디버깅이 용이하도록 엔티티가 캐시에서 삭제되지 않도록 합니다.

ehcache.xml:

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:noNamespaceSchemaLocation="ehcache.xsd"
  Name="CacheManager" 
  maxBytesLocalHeap="250m">

<defaultCache eternal="true"
...
/>

<cache name="org.hibernate.cache.internal.StandardQueryCache"
       eternal="true"
...
/>

모든 것이 정상인지 확인하려면 응용 프로그램 시작 시 다음 로그를 기록해야 합니다.

Could not find a specific ehcache configuration for cache named [com.yourcompany.YourClass]; Using defaults.

즉, 엔티티 캐시 주석이 올바르게 읽혀지고 기본 캐시가 사용됩니다.

「 」로 entityManager.find(Clazz.class, pk)쿼리 캐시가 아니라 엔티티 캐시만 해당됩니다.쿼리에 ).및 relations (...) 。

또한 org.hibernate.cache.ehcache를 사용합니다.SingletonEhCacheRegionFactory가 더 나은지 모르겠습니다.

JCache, Ehcache, Gvava Cache, 헤이즐캐스트 캐시, 카페인 캐시 중 서드파티 캐시 공급자를 사용할 수 있습니다.

스프링 부트에서의 세컨드레벨 캐시 활성화 및 설정 방법에 대해서는 Quora에서 다음 답변을 참조하십시오.

언급URL : https://stackoverflow.com/questions/31585698/spring-boot-jpa2-hibernate-enable-second-level-cache

반응형