キャッシュ初解(二)

3550 ワード

EHCAcheソース分析:
まずキャッシュクラスCacheManagerを見て
public class CacheManager {
  // CLASSPATH ehcache.xml , 
    /**
     * Keeps track of all known CacheManagers. Used to check on conflicts.
     * CacheManagers should remove themselves from this list during shut down.
     */
    public static final List ALL_CACHE_MANAGERS = Collections.synchronizedList(new ArrayList());

    private static final Log LOG = LogFactory.getLog(CacheManager.class.getName());

    /**
     * The Singleton Instance.
     */
    private static CacheManager singleton;

    /**
     * Caches managed by this manager.
     */
    protected final Map caches = new HashMap();

    /**
     * Default cache cache.
     */
    private Ehcache defaultCache;

このクラスを呼び出すにはCacheManager manager=new VacheManager()が必要です.
新規作成:manager.create();
   public static CacheManager create() throws CacheException {
        synchronized (CacheManager.class) {
            if (singleton == null) {
                if (LOG.isDebugEnabled()) {
                    LOG.debug("Creating new CacheManager with default config");
                }
                singleton = new CacheManager();
            } else {
                if (LOG.isDebugEnabled()) {
                    LOG.debug("Attempting to create an existing singleton. Existing singleton returned.");
                }
            }
            return singleton;
        }
    }

このメソッドはデフォルト構成で、ファクトリメソッドで単一のオブジェクトキャッシュマネージャを作成します.
getInstance()でインスタンスを取得することもできます
  public static CacheManager getInstance() throws CacheException {
        return CacheManager.create();
    }

キャッシュ名に基づいてキャッシュオブジェクトを取得するには
  public synchronized Cache getCache(String name) throws IllegalStateException, ClassCastException {
        checkStatus();
        return (Cache) caches.get(name);
    }

キャッシュは、Mapコレクションでデータを格納するものであってもよいし、
 public synchronized Ehcache getEhcache(String name) throws IllegalStateException {
        checkStatus();
        return (Ehcache) caches.get(name);
    }

EHcacheを取得します
キャッシュはどのように格納されているのか、以下のコードを見ればわかります.
   public synchronized void addCache(String cacheName) throws IllegalStateException,
            ObjectExistsException, CacheException {
        checkStatus();

        //NPE guard
        if (cacheName == null || cacheName.length() == 0) {
            return;
        }

        if (caches.get(cacheName) != null) {
            throw new ObjectExistsException("Cache " + cacheName + " already exists");
        }
        Ehcache cache = null;
        try {
            cache = (Ehcache) defaultCache.clone();
        } catch (CloneNotSupportedException e) {
            LOG.error("Failure adding cache. Initial cause was " + e.getMessage(), e);
        }
        if (cache != null) {
            cache.setName(cacheName);
        }
        addCache(cache);
    }

addCache()メソッドにより、cacheNameが既に存在するかどうかを判断し、存在しない場合は、デフォルトキャッシュでclone()をcacheにクローンします.つまりmapにクローンします.存在するなら処理しない
以上は私のEHCacheに対する少しの理解で、後でまた引き続き補充します