Я тестирую функции Spring с @Cacheable
с EHCache, но я ничего не могу найти о том, работает ли это с аннотациями Весны @Transactional
.Сделки с Spring Cache Abstraction и JDBC DAO
Я размещаю @Cacheable
и @CacheEvict
по методам DAO, а @Transactional
- на методах обслуживания.
Пусть мой пользователь DAO выглядит следующим образом:
@Cacheable(value="users", key="#id")
User find(BigInteger id);
@CacheEvict(value="users", key="#user.id")
void update(User user);
@CacheEvict(value="users", key="#id")
void delete(BigInteger id);
Проблема может возникнуть, когда, например, GetUser() вызывается, когда removeFriend() находится в стадии разработки, так как пользователь с несвежей кол друга будет повторно кэшируются (или это?):
public User getUser(userId) {
return userDao.find(userId);
}
@Transactional
public void removeFriend(userId, friendId) {
friendDao.remove(friendId);
user.setFriendCount(--numFriends);
userDao.update(user);
// do some other stuff
}
Как я могу гарантировать, что это не обновляет кэш до транзакций базы данных завершена? Я помещаю @CacheEvict
на методы обслуживания в дополнение к методам DAO? Или я добавляю блокировку чтения/записи к методам службы? И если это так, чтобы блокировать, есть ли какие-либо библиотеки для блокировки на основе идентификатора, так как я хотел бы только заблокировать каждого пользователя, а не блокировать глобально, например. @GuardedBy("userLocks.getReadLock(#userId)")
? Существует ли общепринятый способ обработки кэширования и транзакций?
Большое спасибо!
Эта документация, вероятно, также актуальна: http://ehcache.org/documentation/integrations/spring – sdouglass