4

EHCacheを使用してSpringの機能をテストしていますが、これがSpringのアノテーション@Cacheableで機能するかどうかについては何も見つかりません。@Transactional

サービスメソッドを使用しているときに、DAOメソッドを配置@Cacheableしています。@CacheEvict@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
}

データベーストランザクションが完了する前にこれがキャッシュを更新しないようにするにはどうすればよいですか?@CacheEvictDAOメソッドに加えてサービスメソッドを配置しますか?または、サービスメソッドに読み取り/書き込みロックを追加しますか?そして、ロックする場合、グローバルにロックするのではなく、各ユーザーのみをロックしたいので、idに基づいてロックするライブラリはあります@GuardedBy("userLocks.getReadLock(#userId)")か?キャッシングとトランザクションを処理する一般的に受け入れられている方法はありますか?

どうもありがとう!

4

2 に答える 2

4

答えはここにあるので、EHCacheのドキュメントをもう少し調べておく必要があります。

EHCache 2.4+は、Springの@Transactionalアノテーションで動作します。トランザクションマネージャーのルックアップを構成する必要があります。

于 2012-06-06T20:59:35.510 に答える
1

ドキュメントでは、他のアノテーション駆動のSpring機能と相互作用するキャッシングの抽象化については言及されていません。

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

キャッシングの抽象化はかなり新しく、現時点では範囲がかなり小さいようです。

ほとんどの場合、操作の順序に合わせてキャッシュを使用するには、コードを再設計する必要があります。

于 2012-06-06T02:03:25.897 に答える