Ehcache配置+Spring

如下内容是根据JSR107-Java-Caching-API,加上平时的使用总结的。html

注:建议在读下面的内容以前,先去了解下JSR107中的内容,trust me!java

1、Fundamentals 

1. JSR107中定义了五种core interfaces

  • CachingProvider
  • CacheManager
  • Cache
  • Entry(这个Entry就是放入到Cache中的key-value键值对)
  • ExpiryPolicy(过时策略)

    对上图的说明:一个Application能够使用多个CachingProvider;每一个CachingProvider能够管理多个CacheManager;每一个CacheManager能够管理多个Cache;每一个Cache中能够有多个Entry。在Spring中使用这个Ehcache时,就须要定义CacheManager的name和CacheManager中管理的Cache。web

2. Store-By-Value 和 Store-By-Reference

    Entry存储在Cache中时,有俩种机制: Store-By-Value和Store-By-Reference。spring

  • Store-By-Value: JSR107中规定,在将Entry存储到Cache时,对Key和Value进行拷贝,然后实际存储到Cache中的是这个拷贝值;从Cache中读取时,实际拿到的只是Cache中Entry的拷贝值。因此Store-By-Value时即便对对象进行了修改,也不会影响到Cache中对应的Entry。
  • Store-By-Reference: JSR107中规定,这种方式是引用存储,存入到Cahe中的是引用,从Cache中返回的也是引用,因此在使用这种方式时,必定要注意修改带来的相互影响。

        实际使用时是Reference还Value类型,可自行写几行代码验证下,本人验证了下,在不配置特殊参数的状况是Reference类型。 网络

       因为JSR107只是规范,而实际的每一个厂商底层实现的不一样,加上可能写到磁盘或者Ehcache集群(Entry要在网络中传输),因此Entry中的key和value最好都实现java.io.Serializable。框架

2、Ehcahce与Spring

1. ehcache配置的例子

    以下是ehcache配置文件,暂且将该文件命名为ehcache.xml(后面说明中要用到)。ide

<?xml version="1.0"?>
<ehcache xmlms:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="ehcache.xsd">
	<diskStore path="java.io.tmpdir" />
	<cache name="userCache" maxElementsInMemory="1000" eternal="false"
		timeToIdleSeconds="0" timeToLiveSeconds="10" overflowToDisk="false"
		memoryStoreEvictionPolicy="LFU" />
</ehcache>

2. Spring中使用ehcache的例子

    Spring中使用ehcache.xml以下图所示,由EhcacheManagerFactoryBean源码可知,这个ehcache.xml被用于建立一个CacheManager。Spring容器中userCacheManager对应的bean是一个CacheManager(若是以为困惑,那么先去了解下org.springframework.beans.factory.FactoryBean的做用——Mybatis的SqlSessionFactoryBean也使用了FactoryBean的功能,然后再去看下EhCacheManagerFactoryBean的源码)。学习

<bean id="userCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
	<property name="configLocation" value="classpath:ehcache.xml"/>
    <property name="cacheManagerName" value="userCacheManager"/>
</bean>

    至此咱们就有了一个name为userCacheManager的CacheManager,以后就能够使用name为userCache的Cache了。spa

3、Ehcache的xml配置

     这种xml配置通常都有一个schema用于约束xml节点或节点属性的值以及类型。因此能够先去看下ehcache官方给出的ehcache.xsd,Spring中用于配置bean的xml也有它本身的schema,并且Spring的xsd在细节、注释上比ehcache的好。设计

1. ehcache元素中容许出现的元素类型

    下图上框中ref的值是ehcache节点中容许的元素种类;下框中name的值是ehcache节点的属性name。好比从下图中能够看出ehcache节点中能够出现0个或多个cache元素;可是diskStore只能出现0个或者1个;ehcache的属性updateCheck的默认值是true。

    配置不少,这里就不细细列出了,建议去查看下官方的ehcache.xsd。

4、结尾

     最近在看Ehcache的实现,发现其底层用到了LinkedHashmap、ConcurrentHashmap,且在此基础之上作了必定的个性化,可是如何作到element的searchable、写到disk等是如何实现,目前还没看到。待后续努力。

    在此,建议开发人员多去了解下JCP的规范,对了解框架有很大的帮助,好比

  1. Servlet规范(为何Spring在web.xml中定义DispatcherServlet,若是不了解Servlet的执行流程,我以为是难以看懂SpringMVC模块代码的)
  2. Jms规范(为何建立connection的方式有多种)
  3. Java Transaction API (JTA)规范(为何Spring中涉及事物时会有个ResourceManager)
  4. Jdbc规范(transaction、isolation、distributed transaction)

    一样,咱们在设计框架时,应该注重规范化,参考JCP的相应规范,好比Spring batch模块就遵循了batch规范,这样框架才会易于学习、传播。

相关文章
相关标签/搜索