Spring 3.1 Cache Аннотация EhCache - PullRequest
       27

Spring 3.1 Cache Аннотация EhCache

0 голосов
/ 15 февраля 2012

Я использую Spring 3.1 Cache с использованием 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;
}

Если я вызываю findByPK (), то сначала она попадает в базу данных, а затем попадает в кеш, поэтому метод кэширования работает. findAll () то же самое. Тем не менее, есть ли способ указать Spring, чтобы вызовы findByPK () распознавали результаты, возвращаемые findAll ()?

1 Ответ

1 голос
/ 16 февраля 2012

Это серьезный хак, но он даст вам необходимую функциональность:

@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;
}
...