Ehcache一点笔记
n ElementInfo.java
状态类,由元素名、bean和父元素信息构成。
n BeanHandler.java
(1) createChild(final ElementInfo parent, final String name)
取得父类的名称,如Configuration,然后找到方法addDiskStrore。
n Configuration.java
由一些静态的类DiskStore.java、DefaultCache.java和Cache.java构成。
n CacheManager.java
1、根据配置文件名进行create:首先new一个CacheManager。
2、New的时候,首先设置为未初始化状态,然后读取配置文件,进行XML解析,然后首先读取defaultCache(读取配置文件后,首先new一个cache)。
3、读取diskStorePath,读取<cache>的cache列表,根据cache名称从xml中获取configuration,然后根据configuration的参数创建一个cache,然后保存到CacheManager中的HashMap中。此时的cache是未初始化状态。
然后addCacheNoCheck,对cache进行初始化。
4、cache初始化:如果是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,调用cache的dispose方法保存cache。然后设置状态为关闭状态。
3、完成之后对cacheManager设置为空。
其中cache的dispose:
1、检查状态,调用memoryStore的dispose方法。如果STATUS_DISPOSED状态,则返回。如果是isDiskPersistent,则spoolAllToDisk(),否则对MemoryStore的LinkedHashMap的内容清空。设置为disposed状态,对memoryStore和cache设置为空。然后是overflowToDisk,则表明内容满时写到磁盘中,调用diskStore的dispose进行保存。
上面的含义是:程序关闭的时候,首先判断是否关闭时要diskPersistence,如果是则把内存中的所有内容都保存到磁盘中。此时设置了overFlowToDisk为true,此时实际上内存中内容为空,调用它只是再次验证。如果为false,实际上内存中所有内容都保存到磁盘了。
如果关闭时候diskPersistence为false,也会内存中的东西进行清空。如果overFlowToDisk为true,则调用diskStore的dispose进行存储,如果为false,则保存。
如果是diskPersistent为true,则overflowToDisk也应为true,否则会出现NullPointer的错误,因为此时MemoryStore的内容已经为空了。
如果diskPersistent为false,则overflowToDisk不管是否true还是false,都不会出错,会把内存满的部分写到磁盘中。
n CacheManager
1、创建CacheManager的过程:
调用XML解析器读取配置文件,配置文件用Configuration类来封装。读取defaultCache的配置参数,然后根据这些参数创建一个cache。但是创建cache之后状态还是STATUS_UNINITIALISED,需要创建diskStore和MemoryStore的时候,状态才是STATUS_ALIVE。调用cache.initialise(configuration);的初始化之后将其添加到Cache管理器的哈西表中。
2、获取cache:
从cache管理器的哈西表中获取即可。
3、构造Element。
4、将Element放到cache中:检查状态,复位计数器,调用MemoryStore将其放到LinkedHashMap中。
5、然后关闭cache管理器。
n 从cache中取得元素
1、首先从内存中查找,首先从LinkedHashMap中查找,如果找到了,同时更新element的lastAccessTime,然后判断元素是否过期,如果是过期,则删除元素,如果从内存中没有找到元素,则从磁盘中查找元素(overflowToDisk为true)。
元素的查找区分内存中查找和磁盘中查找。如果找到了,则hitCount++否则missCountNotFound++;
n isExpired(Element element)判断元素是否过期
如果是eternal,则元素不会过期,首先判断当前时间减去元素创建时间之后是否超过了timeToLiveSeconds,如果是则过期了。然后判断当前时间减去元素的最后次访问时间是否超过了timeToIdleSeconds,如果是则过期了。否则没有过期。
n remove(Serializable key)元素的删除
1、首先从MemoryStore中删除,删除就是根据关键字从LinkedHashMap中删除。
2、如果是overflowToDisk为true,则调用diskStore的删除。
元素的删除区分内存的删除和磁盘的删除。
发表评论
- 浏览: 64446 次
- 性别:

- 来自: 广州

- 详细资料
搜索本博客
最新评论
-
JavaEye之路
引用我也很喜欢JavaEye,比CSDN好 CSDN太杂了规模大了能不大而全吗? ...
-- by Sam1860 -
JavaEye之路
我在这,随便说点啥,博客,论坛,都说我应该是一个新手的帖子。不过我还是呆在这。反 ...
-- by saharabear -
我是穷忙族
-- by lbyzx123 -
JavaEye之路
javaeye目前的问题: 1,缺乏一个好的盈利模式,商业化运作 2,技术定位 ...
-- by kimmking -
JavaEye之路
我也很喜欢JavaEye,比CSDN好 CSDN太杂了
-- by lovefly_zero






评论排行榜