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 回答