2012-02-15 4 views
0

현재 캐싱 메소드를 구현하기 위해 EhCache를 사용하는 Spring 3.1 Cache를 사용하고 있습니다. 내가) findByPK를 (전화 먼저 데이터베이스를 조회 할 경우Spring 3.1 캐시 어노테이션 EhCache

@Cacheable("items") 
public Item findByPK(int itemID) { 
    String sql = "SELECT * FROM ITEM WHERE ITEM_ID = ?"; 
    Item item = getJdbcTemplate().queryForObject(sql, new Object[]{itemID}, new ItemRowMapper()); 
    return item; 
} 

@Cacheable("items") 
public List<Item> findAll() { 
    String sql = "SELECT * FROM ITEM"; 
    List<Item> items = getJdbcTemplate().query(sql,new ItemRowMapper()); 
    return items; 
} 

, 그때 이후는 캐시 안타, 그래서 방법 캐싱 작품 : 아래의 코드를 생각해 보자. findAll() 같은. 그러나 findByPK() 호출이 findAll()이 반환 한 결과를 인식하도록 봄을 지시하는 방법이 있습니까?

답변

1

이 주요 해킹이지만, 그것은 당신에게 당신이 원하는 기능을 제공합니다 :

@Cacheable("items") 
public Item findByPK(int itemID) { 
    String sql = "SELECT * FROM ITEM WHERE ITEM_ID = ?"; 
    Item item = getJdbcTemplate().queryForObject(sql, new Object[]{itemID}, new ItemRowMapper()); 
    return item; 
} 

@Cacheable("items") 
public List<Item> findAll() { 
    String sql = "SELECT * FROM ITEM"; 
    List<Item> items = getJdbcTemplate().query(sql,new ItemRowMapper()); 
    for (Item item : items){ 
     removeThenAddToCache(item.getID(), item); 
    } 
    return items; 
} 

@CacheEvict(value = "items", key="#itemID") 
public void removeThenAddToCache(int itemID, Item item) { 
    addToCache(item); 
} 

@Cacheable(value = "items", key="#itemID") 
public Item addToCache(int itemID, Item item) { 
    return item; 
} 
+3

당신이 봄 프록시를 사용하지 않을 경우 당신이 직조하는 경우에만 작동합니다. – digitaljoel

+0

좋아 보인다. 시험해 보자. – arrehman

+0

@ digitaljoel 동의 함 – aweigold