2012-06-05 2 views
3

Я тестирую функции 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)")? Существует ли общепринятый способ обработки кэширования и транзакций?

Большое спасибо!

ответ

4

Я должен был изучить документацию EHCache немного больше, потому что ответ here.

EHCache 2.4+ работает с аннотацией @Transactional от Spring. Просто нужно настроить поиск менеджера транзакций.

+0

Эта документация, вероятно, также актуальна: http://ehcache.org/documentation/integrations/spring – sdouglass

2

В документах не упоминается кэширующая абстракция, имеющая какие-либо взаимодействия с другими функциями Spring, связанными с аннотацией.

http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/cache.html

Абстракция кэширования довольно новая и, кажется, довольно небольшие по масштабам в данный момент.

Скорее всего, вам понадобится перестроить свой код, чтобы использовать кеширование таким образом, чтобы он соответствовал вашему порядку операций.

+0

Спасибо sdouglass. Думаю, я не смогу использовать абстрактную абстракцию кеширования. Я думаю, что это довольно большой пробел в функции, поскольку кеширование часто используется поверх вызовов базы данных. Сделки упоминаются в документации («Подобно поддержке транзакций ...»), но, к сожалению, в неправильном контексте! – andy

+0

Было бы здорово, если бы они могли обеспечить некоторую интеграцию. Интересно, хотя, если вы нападаете, это не просто проблема параллельного параллелизма? Вы всегда можете прибегнуть к синхронизации/семафорам/etc. если вы действительно хотите обеспечить соблюдение «не допускайте угрозы вызова метода X, а любой другой поток - в методе Y». – sdouglass

+0

Без кэширования [at] Transactional предоставляет всю необходимую нам синхронизацию; с кешированием, он становится более сложным - как вы сказали, нам может потребоваться добавить синхронизацию. Однако синхронизация на уровне метода обслуживания не будет работать с [at] Transactional, потому что транзакции обертывают метод. Кажется, что для добавления кеширования (в том виде, в котором мы требуем) мы не можем использовать [at] Transactional или [at] Cacheable. – andy

Смежные вопросы