DB 업데이트 후 수동으로 최대 절전 모드 2단계 캐시 지우기
곧 DB(Oracle)에서 볼 수 있도록 매핑된 엔티티가 있는데, 2단계 캐시(read only strategy) --ehcache가 활성화되어 있습니다.
DB의 일부 열을 수동으로 업데이트하면 캐시가 업데이트되지 않습니다.
나는 이것을 할 방법을 찾지 못했습니다.Hibernate 엔티티를 통해 업데이트가 수행되는 경우에만 해당됩니다.
어떻게든 이 기능을 구현할 수 있을까요?
테이블(또는 보기)을 모니터링하는 작업?아니면 구체적인 테이블에서 DB 변경에 대해 Hibernate에 통보하는 방법이 있을 수도 있습니다.
답변해주셔서 감사합니다!
Hibernate JavaDoc에 따르면, 당신은 다음을 사용할 수 있습니다.org.hibernate.Cache.evictAllRegions()
:
evictAllRegions() 캐시에서 모든 데이터를 제거합니다.
Session and SessionFactory 사용:
Session session = sessionFactory.getCurrentSession();
if (session != null) {
session.clear(); // internal cache clear
}
Cache cache = sessionFactory.getCache();
if (cache != null) {
cache.evictAllRegions(); // Evict data from all query regions.
}
1) 전체 세션이 아닌 하나의 엔티티만 업데이트해야 하는 경우(db에서 직접 업데이트하는 경우 특정 엔티티만 업데이트됨) 다음을 사용할 수 있습니다.
evictEntityRegion(ClassentityClass) 주어진 영역에서 모든 엔터티 데이터를 제거합니다(즉, e.
2) DB에서 직접 업데이트할 수 있는 엔티티가 많은 경우 2차 레벨 캐시에서 모든 엔티티를 제거하는 이 방법을 사용할 수 있습니다(JMX 또는 다른 관리 도구를 통해 관리자에게 이 방법을 노출할 수 있습니다).
/**
* Evicts all second level cache hibernate entites. This is generally only
* needed when an external application modifies the game databaase.
*/
public void evict2ndLevelCache() {
try {
Map<String, ClassMetadata> classesMetadata = sessionFactory.getAllClassMetadata();
Cache cache = sessionFactory.getCache();
for (String entityName : classesMetadata.keySet()) {
logger.info("Evicting Entity from 2nd level cache: " + entityName);
cache.evictEntityRegion(entityName);
}
} catch (Exception e) {
logger.logp(Level.SEVERE, "SessionController", "evict2ndLevelCache", "Error evicting 2nd level hibernate cache entities: ", e);
}
}
3) 여기에는 postgresql+hibernate에 대한 다른 접근 방식이 설명되어 있습니다. Oracle에 대해 이와 유사한 작업을 수행할 수 있다고 생각합니다.
데이터베이스에서 비동기 캐시를 업데이트하려면 데베지움을 사용합니다.https://debezium.io/ 을 방문하면 더 많은 정보를 알 수 있습니다.
또한 이 기사는 https://debezium.io/blog/2018/12/05/automating-cache-invalidation-with-change-data-capture/ 을 직접 구현하기 때문에 많은 도움이 됩니다.
앞서 언급한 바와 같이 백엔드에서 DB를 수동으로 업데이트할 때(애플리케이션/동면 세션은 아니지만) 캐시는 업데이트되지 않습니다.그리고 당신의 지원서는 여전히 그것에 대해 무지합니다.
변경 내용을 앱에 알려주려면 경우에 따라 전체 캐시 또는 엔티티와 관련된 캐시의 일부를 새로 고쳐야 합니다.이 방법은 두 가지 방법으로 가능합니다.
1 - 응용프로그램 재시작 - 이 경우 업데이트된 DB 변경사항으로 캐시가 재구성됩니다.
2 - 앱을 다시 시작하지 않고 업데이트 트리거 - 앱을 다시 시작할 필요는 없지만 현재 캐시가 잘못되었으며 새로 고쳐야 한다는 것을 응용 프로그램에 알려주어야 합니다.
이 외부 푸시를 여러 가지 방법으로 앱에 적용할 수 있습니다.아래에 나열된 것은 거의 없습니다.
- JMX를 통해서.
- 게시된 URL의 서블릿을 통해 캐시를 새로 고칩니다.DB에서 테이블을 변경한 후 URL을 누릅니다.
- 응용프로그램에서 수신자를 호출하는 데이터베이스에 트리거를 구현합니다.
외부 푸시/관리 작업을 구현하는 동안 캐시/리프레시 캐시를 무효화하기 위한 요구사항에 따라 적합한 캐시 관련 메서드를 호출할 수 있습니다.예:
Session.refresh(), Cache.evictAllRegions(), Cache.evictEntityRegion(entityName) etc
다른 투고에 기술된 바와 같이
여기서 두 번째 레벨 캐시를 제어하는 방법을 찾을 수 있습니다.
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-sessioncache
사용가능session.refresh()
현재 세션에 저장되어 있는 개체를 다시 로드하는 메서드입니다.
자세한 내용을 보려면 개체 로드를 읽으십시오.
JEE 7.0 기준:
myStatelessDaoBean.getSession().evict(MyEntity.class);
언급URL : https://stackoverflow.com/questions/40302097/clear-hibernate-2nd-level-cache-after-manually-db-update
'source' 카테고리의 다른 글
액세스 권한에 의해 금지된 방식으로 소켓에 액세스하려고 시도했습니다. (0) | 2023.10.23 |
---|---|
Linux 정적 라이브러리에서 기호 제한 (0) | 2023.10.23 |
C 함수의 인수와 C 함수의 오버로드에 대한 기본값 (0) | 2023.10.23 |
VS 2012에서 웹 배포 게시 작업 전에만 PowerShell 스크립트를 실행하는 방법은 무엇입니까? (0) | 2023.10.23 |
Android ClickableSpan이 Click을 호출하지 않음 (0) | 2023.10.23 |