在ehcache中配置对象级缓存

时间:2015-01-05 15:02:26

标签: java spring caching ehcache

有没有办法在ehcache中配置对象或类级别缓存(每个都有不同的设置)?我正在使用java + spring + mybatis stack。

此外,基于oscache的实现的ehcache相当于什么?

public Map<Integer, ProductDetails> getProductDetails(final List<Integer> productIds)
throws Exception{
    Map<Integer, ProductDetails> result = null;

    try{
        //Get from cache.
        result = (Map<Integer, ProductDetails>) cache.getFromCache("AllProductDetails");

        if(result == null){
            throw new NeedsRefreshException("Cache needs a refresh!");
        }
    }
    catch(final NeedsRefreshException nre){
        try{
            result = ProductDetailsDao.getProductDetails("");
            cache.putInCache("AllProductDetails", result);
        }
        catch (final Exception e){
            result = (Map<Integer, ProductDetails>) nre.getCacheContent();
            cache.cancelUpdate("AllProductDetails");
        }
    }
    return result;
}

我发现在ehcache中没有相应的com.opensymphony.oscache.base.NeedsRefreshException。

确定特定对象的数据是否已过期或者该对象根本不存在于缓存中的推荐方法是什么?

1 个答案:

答案 0 :(得分:0)

您需要在EHcache对象上调用getCacheConfiguration。然后,您可以修改其fields

这是一些检查到期或丢失的示例代码。请注意使用getQuiet以确保您不会通过查看来重置到期时间。

  public boolean expired(final K key) {
      boolean expired = true;
      // Do a quiet get so we don't change the last access time.
      final Element element = cache.getQuiet(key);
      if (element != null) {
        expired = cache.isExpired(element);
        if (expired) {
          log.trace("Expired because expired.");
        } else {
          expired = element.getObjectValue() == null;
          if (expired) {
            log.trace("Expired because value null.");
          }
        }
      } else {
        log.trace("Expired because not present.");
      }
      return expired;
  }