스프링 부트 + 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
또는@ManyToOne
relation - 추가@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
누군가에게 도움이 되길 바랍니다:)
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
'programing' 카테고리의 다른 글
리액트 라우터 컴포넌트에 예기치 않은 토큰 < 오류가 있습니다. (0) | 2023.03.09 |
---|---|
Woocommerce를 수량과 함께 카트 URL에 추가하시겠습니까? (0) | 2023.03.09 |
Wordpress에서 사이드바 위젯에 사용자 지정 게시물 유형의 단일 무작위 게시물을 표시하려면 어떻게 해야 합니까? (0) | 2023.03.09 |
create-react-app을 사용하여 작성된 리액트 프로젝트의 웹 팩 구성을 업데이트하려면 어떻게 해야 합니까? (0) | 2023.03.09 |
변수 감시 및 변경 (0) | 2023.03.09 |