Spring Cache Abstraction和JDBC DAO的事务

时间:2012-06-05 20:25:07

标签: java spring caching transactions locking

我正在使用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)")?是否有一种普遍接受的处理缓存和事务的方法?

非常感谢!

2 个答案:

答案 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

缓存抽象很新,目前在范围上看起来相当小。

您很可能需要重新构建代码,以便以更符合您的操作顺序的方式使用缓存。