2016-06-27 1 views
0

봄 최적화 으로 Ehcache 내가으로 Ehcache (2.10.1)와 스프링을 사용하고

(4.2.5)

내가 이렇게 캐시 내 BookDao의 방법을 구성 :

@Cacheable(value = "bookByName", key = "#name") 
public Book findByName(String name) { 
    //find book by name in db 
} 

@Cacheable(value = "bookById", key = "#id") 
public Book findById(int id) { 
    //find book by id in db 
} 

@Cacheable(value = "books", key = "??") 
public List<Book> findAll() { 
    //find books in db 
} 

첫째, 가능한 것 findAll 캐시와 findById 캐시 또는 findByName 캐시를 결합 하시겠습니까? 그렇게하려면 key annotation parameter에 무엇을 넣어야합니까?

둘째, 책을 업데이트하거나 만들려면 각 캐시에이 책을 추가/제거하고 전체 findAll 메서드 목록을 제거해야합니다. 더 나은 방법이 있습니까?

답변

2

개념적 수준의 응답. Spring 캐싱 주석이나 JSR107 캐싱 주석뿐만 아니라 모든 캐시에서 기본적으로 동일한 문제입니다. 먼저

, findById 캐시 또는 findByName 캐시 findAll 캐시를 결합 할 수 있을까요? 이렇게하려면 키 주석 매개 변수에 무엇을 넣어야합니까?

아니요. 주석으로는 불가능합니다. 캐시를 지우는 것을 제외하고는 주석으로 대량 작업을 수행 할 수 없습니다.

명령 캐시 인터페이스를 사용하여 캐시의 모든 항목을 검색 할 수도 있지만 사용 가능한 모든 책이 아닌 캐시의 책일 수 있습니다. 캐시는 적어도 실제로 캐시 인 경우 사용 가능한 모든 책을 알지 못합니다.

둘째, 내가 업데이트하거나 I 추가/각 캐시에이 책을 축출하고 findAll 방법의 전체 목록을 퇴거해야 할 한 권의 책을 만들려면. 더 나은 방법이 있습니까?

모든 도서의 목록이 있다면 무엇을 위해 캐시가 필요합니까?

목록에있는 모든 책의 하위 집합을 반환 할 수 있습니다. 이 경우 매개 변수는 쿼리가 될 수 있습니다. 목록 크기가 제한되어 처리 중이거나 캐싱 할 때 메모리가 부족하지 않도록해야합니다. 이상적으로는 List<Integer>을 ID로 반환하거나 List<Book>을 ID 배열로 백업하고 캐시에서 책 객체를 검색하는 것이 이상적입니다.

모든 서적을 처리하려면 Iterator<Integer> findAll() 또는 Iterator<Book> findAll()이라는 방법이 더 적절할 것입니다. 결과 크기가 제한되어 있지 않으므로 캐시는 데이터의 작은 부분에 더 자주 액세스 할 때만 의미가 있습니다.