source

DB 업데이트 후 수동으로 최대 절전 모드 2단계 캐시 지우기

manycodes 2023. 10. 23. 21:57
반응형

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 - 앱을 다시 시작하지 않고 업데이트 트리거 - 앱을 다시 시작할 필요는 없지만 현재 캐시가 잘못되었으며 새로 고쳐야 한다는 것을 응용 프로그램에 알려주어야 합니다.

  • 이 외부 푸시를 여러 가지 방법으로 앱에 적용할 수 있습니다.아래에 나열된 것은 거의 없습니다.

    1. JMX를 통해서.
    2. 게시된 URL의 서블릿을 통해 캐시를 새로 고칩니다.DB에서 테이블을 변경한 후 URL을 누릅니다.
    3. 응용프로그램에서 수신자를 호출하는 데이터베이스에 트리거를 구현합니다.
  • 외부 푸시/관리 작업을 구현하는 동안 캐시/리프레시 캐시를 무효화하기 위한 요구사항에 따라 적합한 캐시 관련 메서드를 호출할 수 있습니다.예: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

반응형