2008-04-21

Ehcache一点笔记

n      ElementInfo.java

状态类,由元素名、bean和父元素信息构成。

 

n        BeanHandler.java

(1)    createChild(final ElementInfo parent, final String name)

取得父类的名称,如Configuration,然后找到方法addDiskStrore

 

n        Configuration.java

由一些静态的类DiskStore.javaDefaultCache.javaCache.java构成。

 

n        CacheManager.java

1、根据配置文件名进行create:首先new一个CacheManager

2New的时候,首先设置为未初始化状态,然后读取配置文件,进行XML解析,然后首先读取defaultCache(读取配置文件后,首先new一个cache)

3、读取diskStorePath,读取<cache>cache列表,根据cache名称从xml中获取configuration,然后根据configuration的参数创建一个cache,然后保存到CacheManager中的HashMap中。此时的cache是未初始化状态。

然后addCacheNoCheck,对cache进行初始化。

4cache初始化:如果是overflowToDisk,则创建一个diskStore,然后创建一个MemoryStore。如果是diskPersistent,则添加addShutdownHook关闭钩子。设置状态为STATUS_ALIVE,初始化完成。此时将该初始化后的cache放到cache哈西表中

5、从cache哈西表中根据名称获取cache

6、构造一个元素Element

7、用cache.put将元素放在MemoryStore,首先会检查状态,然后放到MemoryStore中。

 

n        CacheManager关闭

1、如果是STATUS_SHUTDOWN状态,则返回。

2、从cache哈西表中逐个扫描cache,调用cachedispose方法保存cache。然后设置状态为关闭状态。

3、完成之后对cacheManager设置为空。

其中cachedispose

1、检查状态,调用memoryStoredispose方法。如果STATUS_DISPOSED状态,则返回。如果是isDiskPersistent,则spoolAllToDisk(),否则对MemoryStoreLinkedHashMap的内容清空。设置为disposed状态,对memoryStorecache设置为空。然后是overflowToDisk,则表明内容满时写到磁盘中,调用diskStoredispose进行保存。

 

上面的含义是:程序关闭的时候,首先判断是否关闭时要diskPersistence,如果是则把内存中的所有内容都保存到磁盘中。此时设置了overFlowToDisktrue,此时实际上内存中内容为空,调用它只是再次验证。如果为false,实际上内存中所有内容都保存到磁盘了。

 

如果关闭时候diskPersistencefalse,也会内存中的东西进行清空。如果overFlowToDisktrue,则调用diskStoredispose进行存储,如果为false,则保存。

 

 

如果是diskPersistenttrue,则overflowToDisk也应为true,否则会出现NullPointer的错误,因为此时MemoryStore的内容已经为空了。

 

如果diskPersistentfalse,则overflowToDisk不管是否true还是false,都不会出错,会把内存满的部分写到磁盘中。

n        CacheManager

1、创建CacheManager的过程:

调用XML解析器读取配置文件,配置文件用Configuration类来封装。读取defaultCache的配置参数,然后根据这些参数创建一个cache。但是创建cache之后状态还是STATUS_UNINITIALISED,需要创建diskStoreMemoryStore的时候,状态才是STATUS_ALIVE。调用cache.initialise(configuration);的初始化之后将其添加到Cache管理器的哈西表中。

2、获取cache

cache管理器的哈西表中获取即可。

3、构造Element

4、将Element放到cache中:检查状态,复位计数器,调用MemoryStore将其放到LinkedHashMap中。

5、然后关闭cache管理器。

n        cache中取得元素

1、首先从内存中查找,首先从LinkedHashMap中查找,如果找到了,同时更新elementlastAccessTime,然后判断元素是否过期,如果是过期,则删除元素,如果从内存中没有找到元素,则从磁盘中查找元素(overflowToDisktrue)。

元素的查找区分内存中查找和磁盘中查找。如果找到了,则hitCount++否则missCountNotFound++;

n        isExpired(Element element)判断元素是否过期

如果是eternal,则元素不会过期,首先判断当前时间减去元素创建时间之后是否超过了timeToLiveSeconds,如果是则过期了。然后判断当前时间减去元素的最后次访问时间是否超过了timeToIdleSeconds,如果是则过期了。否则没有过期。

 

n        remove(Serializable key)元素的删除

1、首先从MemoryStore中删除,删除就是根据关键字从LinkedHashMap中删除。

2、如果是overflowToDisktrue,则调用diskStore的删除。

元素的删除区分内存的删除和磁盘的删除。

评论
发表评论

您还没有登录,请登录后发表评论

Azi
搜索本博客
存档
最新评论