Spring 3.1 Кэш Аннотация EhCache

Я использую 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(), он сначала обращается к базе данных, а затем к кешу, поэтому кеширование метода работает. найтиВсе() то же самое. Однако есть ли способ указать Spring, чтобы вызовы findByPK() распознавали результаты, возвращаемые findAll()?


person arrehman    schedule 15.02.2012    source источник


Ответы (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;
}
person aweigold    schedule 15.02.2012
comment
Это будет работать только в том случае, если вы плетете, а не используете прокси-серверы Spring. - person digitaljoel; 16.02.2012
comment
Не работает; Не уверен, что я использую, как мне проверить? как исправить? - person arrehman; 16.02.2012
comment
если вы не настроили плетение, то вы используете прокси Spring по умолчанию. - person digitaljoel; 16.02.2012
comment
Вы можете разделить его на другой компонент, если не хотите настраивать плетение... но это сделает его еще более хакерским. - person aweigold; 16.02.2012
comment
У меня работает еще один хак (неоднократно вызывая findByPK на findAll), я хорошо с этим... Спасибо. - person arrehman; 16.02.2012
comment
Ваш другой метод может быть сложнее для вашей базы данных. Я бы не рекомендовал это. - person aweigold; 16.02.2012
comment
Я знаю, однако это данные только для чтения, выполняющие однократную инициализацию, и это тоже не слишком много данных; я знаю, что это некрасиво; Я предполагаю, что в противном случае мне нужно связать свой код с API EhCache, минуя прозрачность, обеспечиваемую Spring, у меня возникает соблазн сделать это .... мой код не использует спящий режим, а использует Spring jdbc. Я хочу кэширование данных домена, но кеш Spring кэширование методов; следовательно, необходимо сделать работу вокруг. - person arrehman; 16.02.2012