봄 JCache와 포털 및 통합을 통해 0079으로 Ehcache 3.x의 응용 프로그램

기본 요소 : 버전, 개념 및 추상

  • 으로 Ehcache 3.x의는 자바 언어의 라이브러리 캐시의 구현이며, 실현 JSR107 사양을
  • 가된다 org.ehcache 2.X ::으로 Ehcache :으로 Ehcache 3.x를 2.X에서 3.X에, 메이븐 의존 net.sf.ehcache에서으로 Ehcache 업그레이드 후
  • 으로 Ehcache 기본 개념은 다음과 같습니다 :
    • 객체는 "키 - 값 쌍을"캐시에
    • 키 - 값 쌍의 용기는 "캐시 캐시"입니다
    • 각 캐시는 CacheConfigurationBuilder에 의해 건설 자체 구성이다 "캐시 구성 CacheConfiguration"을 가지고
    • 으로 Ehcache는 여러 캐시하는 '캐시 관리자 CacheManager "에 대한 필요성을 관리 할 수 ​​있습니다. 당신은 만들 수 있습니다 또는 이름 CacheManager + 캐시 캐시 확보 하
    • 저장 위치 캐시 객체는 다음과 같습니다 힙 메모리 힙, 외부 힙 메모리 offheap, 하드 디스크. offheap JVM 메모리를 외부에 위치하고, GC 관리하지

프로그래밍 방식으로 캐시를 만들기

의존의 도입

        <dependency>
            <groupId>org.ehcache</groupId>
            <artifactId>ehcache</artifactId>
            <version>3.8.0</version>
        </dependency>

테스트 코드

    @Test
    public void testA() {
        CacheManagerBuilder builder = CacheManagerBuilder.newCacheManagerBuilder();
        CacheManager cacheManager = builder.build();
        cacheManager.init();//cacheManager创建后一定要初始化

        ResourcePoolsBuilder poolsBuilder = ResourcePoolsBuilder.newResourcePoolsBuilder();
        ResourcePools pools = poolsBuilder.heap(10, EntryUnit.ENTRIES).build();//用于配置一个cache的heap/offheap/disk的容量.
        CacheConfigurationBuilder<Long, String> cacheConfigBuilder = CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, pools);
        CacheConfiguration<Long, String> cacheConfiguration = cacheConfigBuilder.build();//创建一个缓存配置

        Cache myCache = cacheManager.createCache("myCache", cacheConfiguration);//根据缓存名称和缓存配置创建缓存
        myCache.put(1L, "hahaha");
        logger.info("{}", myCache.get(1L));
        cacheManager.close();//系统关闭时, 应调用cacheManager的close方法
    }

XML을 통해 캐시 구성을 만듭니다

으로 Ehcache XML 구성 :

<?xml version="1.0" encoding="UTF-8" ?>
<config
        xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
        xmlns='http://www.ehcache.org/v3'
        xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core.xsd">

    <!-- 可以把多个缓存配置相同的部分抽象出来形成cache-template模板 -->
    <cache-template name="myDefaults">
        <key-type>java.lang.Long</key-type>
        <value-type>java.lang.String</value-type>
        <heap unit="entries">200</heap> 
    </cache-template>

    <cache alias="foo">
        <key-type>java.lang.String</key-type>
        <value-type>java.lang.String</value-type>
        <resources>
            <heap unit="entries">20</heap>   <!-- heap可以存储20个元素 -->
            <offheap unit="MB">10</offheap>  <!-- offheap可以存储10MB -->
        </resources>
    </cache>

    <!-- 继承cache-template模板 -->
    <cache alias="bar" uses-template="myDefaults">
        <key-type>java.lang.Number</key-type>
    </cache>

    <cache alias="simpleCache" uses-template="myDefaults" />

</config>

테스트 코드 :

    @Test
    public void testB() {
        URL ehcacheConfigUrl = getClass().getResource("/ehcache.xml");
        Configuration configuration = new XmlConfiguration(ehcacheConfigUrl); //从XML配置改造缓存配置
        CacheManager cacheManager = CacheManagerBuilder.newCacheManager(configuration);//创建CacheManager
        cacheManager.init();

        Cache<String, String> foo = cacheManager.getCache("foo", String.class, String.class);//从CachaManager用缓存名称获取缓存
        foo.put("1", "hehehe");
        logger.info("{}", foo.get("1"));

        Cache<Number, String> bar = cacheManager.getCache("bar", Number.class, String.class);
        bar.put(1, "hohoho");
        logger.info("{}", bar.get(1));

        cacheManager.close();

    }

으로 Ehcache 캐시는 JSR107 (JCache) API를 통해 얻을 - 프로그램

    @Test
    public void testA() {

        //CachingProvider provider = Caching.getCachingProvider("org.ehcache.jsr107.EhcacheCachingProvider");
        CachingProvider provider = Caching.getCachingProvider();//通过spi技术找到provider. 适用于类路径中只有一个JCache实现, 否则得用上面一行代码指明provider
        CacheManager cacheManager = provider.getCacheManager();

        ResourcePoolsBuilder poolsBuilder = ResourcePoolsBuilder.newResourcePoolsBuilder();
        ResourcePools pools = poolsBuilder.heap(10, EntryUnit.ENTRIES).build();
        CacheConfigurationBuilder<Long, String> configBuilder = CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, pools);
        CacheConfiguration<Long, String> cacheConfig = configBuilder.build();//ehcache的configuration

        Cache<Long, String> cache = cacheManager.createCache("myCache", Eh107Configuration.fromEhcacheCacheConfiguration(cacheConfig));//通过Eh107Configuration将ehcache的config转为jcache的config
        cache.put(1L, "hahaha");
        logger.info("{}", cache.get(1L));
        cacheManager.close();

    }

으로 Ehcache는 API를 캐시 구성의 JSR107 (JCache)에 인수 --xml

JSR107 사양의 도입

        <dependency>
            <groupId>javax.cache</groupId>
            <artifactId>cache-api</artifactId>
            <version>1.1.1</version>
        </dependency>

위의 사용으로 Ehcache XML 구성
테스트 코드를 :

    @Test
    public void testB() throws Exception {

        CachingProvider provider = Caching.getCachingProvider("org.ehcache.jsr107.EhcacheCachingProvider");
        URI uri = getClass().getResource("/ehcache.xml").toURI();
        CacheManager cacheManager = provider.getCacheManager(uri, getClass().getClassLoader());
        Cache<String, String> cache = cacheManager.getCache("foo", String.class, String.class);
        cache.put("1", "hehehe");
        logger.info("{}", cache.get("1"));
        cacheManager.close();

    }

스프링으로 Ehcache JCache에 주입함으로써

Spring XML 설정

    <bean id="jCacheManager" class="org.springframework.cache.jcache.JCacheManagerFactoryBean">
        <property name="cacheManagerUri" value="classpath:ehcache.xml" />
    </bean>

    <bean id="cacheManager" class="org.springframework.cache.jcache.JCacheCacheManager">
        <property name="cacheManager" ref="jCacheManager" />
    </bean>

테스트 코드 :

@ContextConfiguration("classpath:spring.xml")
public class SpringJcacheEhcacheTest extends AbstractTestNGSpringContextTests {

    private static final Logger logger = LoggerFactory.getLogger(SpringJcacheEhcacheTest.class);

    @Autowired
    private CacheManager cacheManager;

    @Test
    public void testA() {
        Cache<Number, String> barCache = cacheManager.getCache("bar", Number.class, String.class);
        barCache.put(1, "hahaha");
        barCache.put(2L, "hehehe");
        logger.info("{}", barCache.get(1));
        logger.info("{}", barCache.get(2L));
        cacheManager.close();
    }

}

기타 - 봄의 주입으로 Ehcache 2.x에서

도입 Ehcache2.x

        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache</artifactId>
            <version>2.10.6</version>
        </dependency>

으로 Ehcache 2.x를 구성

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
         updateCheck="false" monitoring="autodetect" dynamicConfig="true">

    <diskStore path="java.io.tmpdir"/>

    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="true"
            maxElementsOnDisk="10000000"
            diskPersistent="false"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU"
    />

    <cache name="foo"
           eternal="false"
           timeToLiveSeconds="300"
           maxElementsInMemory="2000"
           maxElementsOnDisk="20000"
           overflowToDisk="true"
           diskPersistent="true"
           memoryStoreEvictionPolicy="FIFO"/>

</ehcache>

스프링 XML 구성

    <bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
        <property name="configLocation" value="classpath:ehcache-2.x.xml"/>
    </bean>

    <bean id="cacheManager2.x" class="org.springframework.cache.ehcache.EhCacheCacheManager">
        <property name="cacheManager" ref="cacheManagerFactory"/>
    </bean>

테스트 코드 :

@ContextConfiguration("classpath:spring.xml")
public class SpringEhcache2xTest extends AbstractTestNGSpringContextTests {

    private static final Logger logger = LoggerFactory.getLogger(SpringEhcache2xTest.class);

    @Autowired
    private EhCacheCacheManager ehCacheCacheManager;

    @Test
    public void testA() {
        CacheManager cacheManager = ehCacheCacheManager.getCacheManager();
        Cache cache = cacheManager.getCache("foo");
        Element ele = new Element(1L, "Ehcache 2.x");
        cache.put(ele);
        logger.info("{}", cache.get(1L).getObjectValue());
        cacheManager.shutdown();
    }

}

최종적으로

으로 Ehcache 3.x의 공식 문서 : http://www.ehcache.org/documentation/3.8/getting-started.html
전체 코드 : https://github.com/JamboSonng/Demo-Master/tree/master/Master-Ehcache

추천

출처www.cnblogs.com/sonng/p/11348298.html