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