2012-06-05 146 views
3

我正在測試Spring的@Cacheable功能與EHCache,但我無法找到任何關於這是否適用於Spring的@Transactional註釋。Spring Cache抽象和JDBC DAO

我在DAO方法上放置了@Cacheable@CacheEvict,而@Transactional在服務方法上。

假設我的用戶DAO是這樣的:

時,例如,的getUser()被調用,而removeFriend()正在進行
@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); 

可能會出現問題,因爲與陳舊的朋友數量的用戶會重新緩存(或不是嗎?):

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)")?是否有一種普遍接受的方式來處理緩存和交易?

非常感謝!

回答

4

我應該多看看EHCache文檔,因爲答案是here

EHCache 2.4+可與Spring的@Transactional註解一起使用。只需要配置一個事務管理器查找。

+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

如果他們能夠提供一些整合,那將是非常好的。我想知道你打的不只是一個基本的併發問題嗎?你總是可以使用同步/信號/等。如果你真的想強制執行「不允許任何威脅調用方法X,而其他線程在方法Y中」。 – sdouglass

+0

沒有緩存,[at] Transactional提供我們需要的所有同步;隨着緩存,它變得更加複雜 - 正如你所說的,我們可能需要添加同步。但是,在服務方法級別進行同步將無法與[事務性]保持一致,因爲事務將環繞該方法。看來要添加緩存(按我們的要求),我們不能使用[at] Transactional或[at] Cacheable。 – andy