2013-03-01 2 views
0

우리는 다음과 같은 속성을 사용하여 최대 절전 모드의 두 번째 레벨 캐시를 사용하도록 설정 :최대 절전 모드 두 번째 레벨 캐시 게으른 컬렉션 크기

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로 변경되었으며 동일한 동작을 참조하십시오.

첫 번째 요청에서 엔티티를 선택하는 쿼리와 컬렉션 크기를 찾기위한 쿼리가 표시됩니다. 엔티티가 캐시되고 있다는 로그 메시지가 표시됩니다.

이후 요청에서 엔티티를로드 할 호출이 없지만 여전히 콜렉션의 크기를 찾는 호출이 있습니다.

답변

0

데이터가 캐시 될 때 데이터베이스 쿼리를 볼 수 없습니다. 선택한 쿼리에 대한 지속적인 로그가 있다고 말합니다. Ehcache는 트랜잭션 캐시를 제공하지 않습니다. 그리고 당신은 그것이 일하고 있다고 말하고 있습니다. 동생이 작동하지 않습니다. 데이터베이스 호출과 동일한 로그가 있습니다. TRANSACTIONAL 캐싱을 지원하지 않으므로 Ehcache 설명서를 확인하십시오.

+0

"Ehcache 문서는 TRANSACTIONAL 캐싱을 지원하지 않기 때문에"- 그게 무슨 뜻입니까? 트랜잭션 캐시는 무엇이라고 생각합니까? – NimChimpsky

+0

CacheConcurrencyStrategy.READ_WRITE로 변경했으며 동일한 동작을 참조하십시오. 첫 번째 요청에서 엔티티를 선택하는 쿼리와 컬렉션 크기를 찾기위한 쿼리를 봅니다. 엔티티가 캐시되고 있다는 로그 메시지가 표시됩니다. 후속 요청에서 엔티티를로드 할 호출이 없지만 여전히 콜렉션의 크기를 찾는 호출이 있습니다. – Chris

0

사용자 목록은 지연로드 모음입니다. 지연로드 모음에는 데이터가 없습니다. Lazy loaded 콜렉션에 액세스하려고하거나 lazy loaded 콜렉션의 크기를 결정할 때마다, 얼마나 많은 요소가 있는지와 같이 그 안의 데이터에 관한 정보가 있어야합니다. 이렇게하면 데이터베이스에서 해당 데이터를 가져와 매번 데이터베이스 쿼리를 생성합니다. 둘 다 맨 위 레벨과 다른 일부 오브젝트에서 목록을 확인했습니다. List가 최상위 오브젝트가 아닌 경우 지연 초기화됩니다. 따라서 컬렉션 또는 컬렉션에 대한 정보를 얻으려는 경우 데이터베이스 쿼리가 생성됩니다.

관련 문제