1

スタンドアロン環境でSpring3.1を使用しています。

エントリをキャッシュしようとしています。したがって、3.1では、@Cacheableを次のように使用できます。

@Cacheable("client")
@Override
public ClientDTO getClientByLogin(String login) throws FixException
{
    ClientDTO client = null;
    try
    {
        client = (ClientDTO) jdbcTemplate.queryForObject(GET_CLIENT_BY_LOGIN_STATEMENT, new Object[]
        { login }, new ClientDTO());
    }
    catch (EmptyResultDataAccessException e)
    {
        log.error("Client login not exist in database. login=" + login);
    }

    if (client == null)
    {
        throw new FixException("Return null from DB when executing getClientByLogin(), login=" + login);
    }
    return client;
}

これで、getClientを呼び出すたびに、キャッシュリポジトリが最初に表示されます。

キャッシュリストを反復処理するために取得したい場合。どうすればいいですか?

ありがとう。

4

3 に答える 3

4

キャッシュされたオブジェクトを取得する場合は、次のコードが機能するはずです

public ClientDTO  getCachedClient() {
        Cache cache = cacheManager.getCache("client");
        Object cachedObject = null;
        Object nativeCache = cache.getNativeCache();
        if (nativeCache instanceof net.sf.ehcache.Ehcache) {
            net.sf.ehcache.Ehcache ehCache = (net.sf.ehcache.Ehcache) nativeCache;
            List<Object> keys = ehCache.getKeys();

            if (keys.size() > 0) {
                for (Object key : keys) {
                    Element element = ehCache.get(key);
                    if (element != null) {

                        cachedObject = element.getObjectValue();

                    }
                }
            }
        }
        return (ClientDTO)cachedObject;

    }
于 2014-08-28T13:04:22.247 に答える
2

Spring Cacheには、キャッシュリストを反復処理するそのような方法はありません。ClientDTOのコレクションを反復処理する場合は、それをキャッシュに入れる必要があります。

@Cacheable(value="client", key="all")
@Override
public List<ClientDTO> getAll() throws FixException  {
  List<ClientDTO> clients = null;
  try {
    clients = ....; // fetch all objects
  } catch (EmptyResultDataAccessException e) {
    //
  }

  if (clients == null) {
    //
  }
  return clients;
}

このような場合、クライアントオブジェクトを変更するたびに、リストを無効にする必要があります。

于 2012-08-06T05:22:20.030 に答える
-5

私は解決策を見つけました:

private ClientDTO getClientDTOByClientId(Integer clientId)
{
    ClientDTO clientDTO = null;
    Cache clientCache = null;
    try
    {
        clientCache = ehCacheCacheManager.getCache("client");
        clientDTO = null;
        if (clientCache != null)
        {
            clientDTO = (ClientDTO) clientCache.get(clientId);
        }
        else
        {
            log.error("clientCache is null");
        }
    }
    catch (Exception e)
    {
        log.error("Couldnt retrieve client from cache. clientId=" + clientId);
    }
    return clientDTO;
}
于 2012-08-06T06:34:19.350 に答える