使用Spring Cache Abstraction和JDBC DAO进行交易

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

非常感谢!

解决方法:

我应该更多地研究一下EHCache文档,因为答案是here.

EHCache 2.4适用于Spring的@Transactional注释.只需要配置事务管理器查找.

上一篇:c# – 在两种不同的场景中锁定性能


下一篇:c# – 在服务器场上锁定(asp.net)