我正在使用EHCache测试Spring的@Cacheable
功能,但我无法找到有关Spring是否适用于@Transactional
注释的任何内容。
我将@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);
例如,当removeFriend()正在进行时调用getUser()时可能会出现问题,因为具有过时朋友计数的用户将被重新缓存(或者它会吗?):
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
}
如何在数据库事务完成之前确保不更新缓存?除了DAO方法之外,我还要在服务方法上放置@CacheEvict
吗?或者,我是否在服务方法中添加读/写锁定?如果是这样锁定,是否有基于id锁定的库,因为我只想锁定每个用户而不是全局锁定,例如@GuardedBy("userLocks.getReadLock(#userId)")
?是否有一种普遍接受的处理缓存和事务的方法?
非常感谢!
答案 0 :(得分:4)
我应该更多地研究一下EHCache文档,因为答案是here。
EHCache 2.4+适用于Spring的@Transactional注释。只需要配置事务管理器查找。
答案 1 :(得分:2)
文档没有提及缓存抽象与其他注释驱动的Spring功能的任何交互。
http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/cache.html
缓存抽象很新,目前在范围上看起来相当小。
您很可能需要重新构建代码,以便以更符合您的操作顺序的方式使用缓存。