우리는 다음과 같은 속성을 사용하여 최대 절전 모드의 두 번째 레벨 캐시를 사용하도록 설정 :최대 절전 모드 두 번째 레벨 캐시 게으른 컬렉션 크기
hibernateProperties.setProperty("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.EhCacheRegionFactory");
hibernateProperties.setProperty("hibernate.cache.use_query_cache", Boolean.TRUE.toString());
hibernateProperties.setProperty("hibernate.cache.use_second_level_cache", Boolean.TRUE.toString());
hibernateProperties.setProperty("hibernate.cache.use_structured_entries", Boolean.TRUE.toString());
hibernateProperties.setProperty("hibernate.cache.generate_statistics", Boolean.TRUE.toString());
을 그리고 캐시 태그 사용하여 우리의 엔티티 태그 :
@Entity
@Indexed
@Table(name = "item")
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
public class Item implements Serializable {
이 엔티티를 게으름 모음 옵션이있는 게으른 모음집이 있습니다.
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
@ManyToMany(fetch = FetchType.LAZY, targetEntity = User.class, mappedBy = "likes")
@LazyCollection(LazyCollectionOption.EXTRA)
private List<User> users;
잘 작동하고 데이터를 캐시 한 후 나는 모든 데이터베이스 쿼리를 볼 수 없지만, 우리가 볼 않는 것은의 크기를 캐시에 최대 절전 모드로 얻을 수있는 방법이 있습니까
select count(user_id) from user_items where item_id =?
호출의 로그입니다 lazy collection이므로 users.size() 할 때 데이터베이스에 접근 할 필요가 없다.
CacheConcurrencyStrategy.READ_WRITE로 변경되었으며 동일한 동작을 참조하십시오.
첫 번째 요청에서 엔티티를 선택하는 쿼리와 컬렉션 크기를 찾기위한 쿼리가 표시됩니다. 엔티티가 캐시되고 있다는 로그 메시지가 표시됩니다.
이후 요청에서 엔티티를로드 할 호출이 없지만 여전히 콜렉션의 크기를 찾는 호출이 있습니다.
"Ehcache 문서는 TRANSACTIONAL 캐싱을 지원하지 않기 때문에"- 그게 무슨 뜻입니까? 트랜잭션 캐시는 무엇이라고 생각합니까? – NimChimpsky
CacheConcurrencyStrategy.READ_WRITE로 변경했으며 동일한 동작을 참조하십시오. 첫 번째 요청에서 엔티티를 선택하는 쿼리와 컬렉션 크기를 찾기위한 쿼리를 봅니다. 엔티티가 캐시되고 있다는 로그 메시지가 표시됩니다. 후속 요청에서 엔티티를로드 할 호출이 없지만 여전히 콜렉션의 크기를 찾는 호출이 있습니다. – Chris