Ehcache(02)ehcache.xml简介
ehcache.xml文件是用来定义Ehcache的配置信息的,更准确的来说它是定义CacheManager的配置信息的。我们知道一切Ehcache的应用都是从CacheManager开始的。在不指定配置信息参数创建CacheManager时,CacheManager将首先在类路径的根目录下寻找一个叫ehcache.xml的文件作为CacheManager的配置文件。如果不存在这样的文件则将使用封装在ehcache jar包中的ehcahce-failsafe.xml文件作为创建CacheManager的默认配置信息。除了使用Configuration作为参数外,使用其它参数构造CacheManager都是基于xml格式的配置信息的。当我们使用xml配置文件作为CacheManager的配置信息时,我们的文件名不一定叫ehcache.xml,这里只是把ehcache.xml文件作为这一类文件的一个代表,它们拥有共同的文档结构。本文将对ehcache.xml做一个简要的介绍,主要介绍常用的配置项。 一、ehcache元素首先我们的ehcache.xml文件必须遵守Ehcache的Xml Schema的定义,我们可以直接使用在线的http://ehcache.org/ehcache.xsd,也可以直接从该地址把ehcache.xsd文件下载到本地。ehcache.xml文件的根元素必须是ehcache,一个ehcache元素就相当于一个CacheManager,我们在ehcache元素上指定的属性以及在ehcache元素下定义的子元素都是针对于当前CacheManager的,比如我们在ehcache元素下定义了一个cache元素,那就代表我们所定义的CacheManager中有这么一个Cache存在。ehcache元素上的属性都是可选的,我们可以在ehcache元素上指定ehcache.xml文件所遵循的schema所在的位置,如: <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"> </ehcache> 1.1 可选属性除了指定ehcache.xml文件所遵循的schema之外,我们的ehcache元素还可以指定很多的属性,主要有如下这些。 name:指定当前CacheManager的名称。 需要注意的是当我们在CacheManager级别上指定了maxBytesLocalOffHeap时会使overflowToOffHeap的默认值变为true。也就是说该CacheManager里面所有的Cache在没有显示的指定overflowToOffHeap属性值时其值默认都是true,原本默认是false。 二、cache元素cache元素是ehcache元素的子元素,一个cache元素就代表一个Ehcache对象的定义。对于一个cache元素而言我们最简单的定义方式是只需要指定所定义的Ehcache的名称,其它的都使用默认配置。默认配置将使用defaultCache元素的定义(这将在后文中讲到)。 2.1 属性cache元素中可以指定的属性也有很多,但只有一个是必须的。那就是name属性。 name:指定cache的名称。 2.2 子元素persistence:表示Cache的持久化,它只有一个属性strategy,表示当前Cache对应的持久化策略。其可选值如下: copyStrategy:当我们指定了copyOnRead或copyOnWrite为true时,就会用到我们的copyStrategy,即拷贝策略了。默认的copyStrategy是通过序列化来实现的,我们可以通过实现net.sf.ehcache.store.compound.CopyStrategy接口来实现自己的CopyStrategy,然后只需在cache元素下定义一个copyStrategy元素并指定其class属性为我们的CopyStrategy实现类。如:<copyStrategy class="xxx.xxx.xxx"/>。 pinning:表示将缓存内的元素固定住,除非过期,否则不会对它进行删除和驱除到其它储存容器中。pinning元素只定义了一个属性store,表示将把元素固定在哪个位置。其可选值有localMemory和inCache。 三、defaultCachedefaultCache元素是用来指定cache的默认配置的,其可以指定的信息大体上跟cache元素是一样的。这些配置只会对在程序中通过CacheManager的addCache(String cacheName)方法添加的Cache起作用。 假设我们的ehcache.xml文件的内容如下: <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" maxBytesLocalDisk="20G" maxBytesLocalHeap="10M"> <defaultCache copyOnRead="true" copyOnWrite="true" overflowToOffHeap="false"/> <cache name="test2" overflowToOffHeap="false"/> </ehcache> 我们可以看到我们指定了defaultCache的copyOnRead和copyOnWrite为true,表示在读和取的时候都会使用拷贝的副本。然后定义了一个叫test2的Cache。接着我们进行如下测试: @Test publicvoid testDefaultCache() { CacheManager cacheManager = CacheManager.create(); //cache1将使用默认配置 cacheManager.addCache("cache1"); Cache cache1 = cacheManager.getCache("cache1"); Element ele = new Element("key","value"); cache1.put(ele); Element ele2 = cache1.get("key"); System.out.println(ele == ele2); //false Cache test2 = cacheManager.getCache("test2"); test2.put(ele); Element ele3 = test2.get("key"); System.out.println(ele == ele3); //true } 我们通过cacheManager指定缓存名称的方式添加了一个叫cache1的Cache,该Cache将使用默认配置,即defaultCache指定的配置。然后我们定义了一个元素ele,并将其存放到cache1中,由于指定了copyOnWrite为true,所以在存放的时候其实存放的是ele的一个拷贝,而不是其引用。之后我们再从cache1中把ele拿出来并赋值给元素ele2,由于我们指定了copyOnRead为true,所以我们拿出来的会是缓存中ele的一个拷贝。之后我们对ele和ele2进行比较,其结果为false。然后我们往ehcache.xml中定义好的名叫test2的Cache中存入ele,因为test2没有指定copyOnWrite为true,所以这里存放的是ele的引用。之后我们再从test2中读取ele并赋值给ele3,因为我们没有指定test2的copyOnRead为true,所以这里读取出来的还是之前存放的ele的引用。之后再比较它们的地址,所得结果为相等。 四、diskStore元素diskStore元素是用来指定磁盘存储的路径的,其只接收一个参数path,表示表示磁盘存储的路径。如: <diskStore path="d:ehcache" /> 如果不希望Ehcache创建磁盘存储的路径,则可以不定义diskStore元素。在没有定义diskStore,但有cache需要使用磁盘存储时会默认使用java.io.tmpdir作为磁盘存储的路径。 diskStore元素的path属性使用如下值时将自动替换为实际对应的值。 java.io.tmpdir:默认的临时文件存放路径。 user.home:用户的主目录。 user.dir:用户的当前工作目录,即当前程序所对应的工作路径。 其它通过命令行指定的系统属性,如"java –DdiskStore.path=D:abc ……"。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |