9

スプリング キャッシュの抽象化を使用して、サービス レイヤーにオブジェクトをキャッシュしています。これは、次のような単純な get/put 操作では問題ありません。

static private final String cacheName = "messages";

@CacheEvict(value=cacheName, key="#message.id")
public void deleteMessage(Message message) {
...
}

@Cacheable(value=cacheName, key="#id")
public Message findMessage(Long id) {
...
}

@CachePut(value=cacheName, key="#message.id")
public void saveMessage(Message message) {
...
}

@CachePut(value=cacheName, key="#message.id")
public Message updateMessage(Message message) {
...
}

ただし、次のメソッドに使用する注釈は次のとおりです。

public long countAllMessages() {
...
}

すべてのオブジェクトがキャッシュに格納されるため、キャッシュから応答を取得し、リポジトリ レイヤーに移動する必要がない方法が必要です。

また、キャッシュは次のメソッドに適用されています。

@Cacheable(cacheName)
public List<Message> findAllMessages() {
...
}

次のように、count メソッドで find all メソッドを呼び出すことができます。

public long countAllMessages() {
    return findAllMessages().size();
}

ただし、キャッシュが無効になっている場合、呼び出しは SELECT COUNT(*) を実行する代わりにデータベースからすべてのレコードをロードするため、これは効率的ではありません...

4

1 に答える 1

16
于 2012-12-26T06:20:25.530 に答える