9

スタンドアロン環境で Spring3.1 を使用しています。@Cachable アノテーションを使用してエントリをキャッシュしています。

特定の値(キーではない)を取得するために、キャッシング リストを反復処理する必要がある場合があります。

そのため、キャッシュされたリストを取得できましたが、その要素をどのように反復処理できますか。

private ClientDTO getClientDTOByClientId(Integer clientId)
{

    Cache clientCache = null;
    try
    {
        clientCache = ehCacheCacheManager.getCache("client");

          //need here to iterate on clientCache. how?


    }
    catch (Exception e)
    {
        log.error("Couldnt retrieve client from cache. clientId=" + clientId);
    }
    return clientDTO;
}

私はehcacheメカニズムを使用しています。

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"
        p:cache-manager-ref="ehcache" />

    <bean id="ehcache"
        class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
        p:config-location="classpath:ehcache.xml" />

ありがとう、レイ。

4

5 に答える 5

17

CacheManager.getCache() は net.sf.ehcache.Cache を返します。これには、繰り返し処理できるキャッシュ キーのリストを返す getKeys() メソッドがあります。(ラップされた net.sf.ehcache.Element ではなく) 格納された実際のオブジェクトを取得するには、Element.getObjectValue() を使用します。

編集:Spring によると、 Cache.getKeys() をサポートするようには見えないため、基になるプロバイダーにキャストする必要があります。

このようなもの:

public boolean contains(String cacheName, Object o) {
  net.sf.ehcache.EhCache cache = (net.sf.ehcache.EhCache) org.springframework.cache.CacheManager.getCache(cacheName).getNativeCache();
  for (Object key: cache.getKeys()) {
    Element element = cache.get(key);
    if (element != null && element.getObjectValue().equals(o)) {
      return true;
    }
  }
  return false;
}
于 2012-08-06T14:10:02.913 に答える