0

メソッドキャッシングを実装するために、現在EhCacheを使用してSpring 3.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());
    return items;
}

findByPK() を呼び出すと、最初にデータベースにヒットし、次にキャッシュにヒットするため、メソッドのキャッシュが機能します。findAll() 同上。ただし、春にfindByPK()呼び出しがfindAll()によって返された結果を認識させるように指示する方法はありますか?

4

1 に答える 1

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;
}
于 2012-02-15T20:09:02.007 に答える