2015-01-10 3 views
2
@Transactional 
public MyEntity getEntity(long id) { 
    return dao.findOne(id); 

    //or select and update as well 
} 

내가 트랜잭션 메서드를 호출 할 때마다 : 나는 최대 절전 모드에서 (처음 제외) 캐시 된 엔터티를받을 수 있습니까? 아니면 항상 DB에서 신선한 엔티티를 가져올 것인가?Spring @Transactional은 어떤 hibernate 캐시를 사용합니까?

동일한 DB를 공유 할 두 개의 독립적 인 응용 프로그램이 있으므로 다른 응용 프로그램이 백그라운드에서 DB의 동일한 엔티티를 이미 업데이트했을 때 최대 절전 모드가 캐시 된 엔티티를 반환하지 않도록하려는 경우 중요합니다.

답변

1

이이 first level cache에 아무것도 의미 다음 최대 절전 모드는 새로운 세션을 생성합니다 서비스 레이어의 트랜잭션 경계합니다. findOne 메서드를 동일한 서비스 메서드 내에서 두 번 호출하려고하면 두 번째 호출에서 캐시에서 엔터티를 가져옵니다. 항상 새로운 최대 절전 모드 세션으로 끝낼

연속 서비스 메서드 호출 (예를 들어, getEntity)가, 그래서 새로운 개체가 데이터베이스에서로드됩니다. 당신이 2 레벨 캐시를 사용하고이 엔티티를 활성화하면

은 다음 Hibernate는 항상 먼저 캐시를 공격하고 캐시 미스에, 데이터베이스로드에 폴백.

데이터 무결성 이상을 방지하려면 어쨌든 optimistic locking을 사용해보십시오.

1

짧은 대답은 '예'입니다.
긴 대답은 @Transactional이 수행하는 모든 작업은 최대 절전 모드 세션을 제공하고 그렇게하도록 구성된 경우 트랜잭션을 시작/커밋하는 것입니다. 세션에 캐시가 활성화되었는지 여부는 중요하지 않습니다. 캐싱은 세션에 의해 내부적으로 수행됩니다.
당신이 필요로하는 것은 최대 절전 모드 캐쉬를 이해하는 것입니다.
첫 번째 레벨 캐시 (세션 당)는 기본적으로 사용 가능하며 비활성화 할 수 없습니다.
두 번째 레벨 캐시 (SessionFactory 당)는 기본적으로 비활성화됩니다. here Ehcache 사용 설정 방법을 참조하십시오. (@Cache 주석 처리 된 엔티티 만 2 차 레벨 캐시로 끝납니다).
@Transactional이 새 세션을 열거 나 기존 세션을 다시 사용할 것인지 여부는 구성 가능하며 구현시 CurrentSessionContext에 따라 다릅니다. 자체 구현을 연결할 수 있습니다.