最近要使用EHCache3.8,网上的文档发现很少,多半都是2.x的,偶尔有些3.x的都是相互复制粘贴一些官网的.而使用JSR-107以Program方式配置的Blog一个都没看到,而且配置DISK 的Persistence 或者 Cluster的URI的也是一个都没有,只有自己手动去找和探索.所以呢总结下.

官方文档

Ehcache 3.8 https://www.ehcache.org/documentation/3.8/index.html

POM

首先是依赖的引入, cache-apiJSR-107 的依赖,2.x的ehcache是引入的 net.sf.ehcache ,而3.x则需要引入 org.ehcache , ehcache-clustered 则是集群所需要的依赖.

     <dependency><groupId>javax.cache</groupId><artifactId>cache-api</artifactId></dependency><dependency><groupId>org.ehcache</groupId><artifactId>ehcache</artifactId></dependency><dependency><groupId>org.ehcache</groupId><artifactId>ehcache-clustered</artifactId></dependency>

Configuration

package com.ehc.generated.config;import java.io.File;
import java.net.URI;
import java.time.Duration;import javax.cache.CacheManager;
import javax.cache.Caching;
import javax.cache.spi.CachingProvider;import com.ehc.generated.domain.User;import org.ehcache.clustered.client.config.builders.ClusteredResourcePoolBuilder;
import org.ehcache.clustered.client.config.builders.ClusteringServiceConfigurationBuilder;
import org.ehcache.config.builders.*;
import org.ehcache.config.units.MemoryUnit;
import org.ehcache.core.config.DefaultConfiguration;
import org.ehcache.impl.config.persistence.DefaultPersistenceConfiguration;
import org.ehcache.jsr107.Eh107Configuration;import org.hibernate.cache.jcache.ConfigSettings;
import org.ehcache.jsr107.EhcacheCachingProvider;import org.springframework.boot.autoconfigure.orm.jpa.HibernatePropertiesCustomizer;
import org.springframework.cache.jcache.JCacheCacheManager;import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.*;@Configuration
@EnableCaching
public class CacheConfiguration {private final javax.cache.configuration.Configuration<String, User> jcacheConfiguration;private JCacheCacheManager jCacheCacheManager;public CacheConfiguration() {jcacheConfiguration = Eh107Configuration.fromEhcacheCacheConfiguration(CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, User.class,ResourcePoolsBuilder.heap(10)// .disk(10, MemoryUnit.MB, true).with(ClusteredResourcePoolBuilder.clusteredShared("resource-pool-a"))).withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(3600))).build());CachingProvider cachingProvider = Caching.getCachingProvider();EhcacheCachingProvider ehcacheProvider = (EhcacheCachingProvider) cachingProvider;DefaultConfiguration configuration = new DefaultConfiguration(ehcacheProvider.getDefaultClassLoader(),// new DefaultPersistenceConfiguration(new File("D:/training/EHCache/cache")),ClusteringServiceConfigurationBuilder.cluster(URI.create("terracotta://localhost:9410/clustered")).autoCreate(c -> c.defaultServerResource("default-resource").resourcePool("resource-pool-a", 10,MemoryUnit.MB, "default-resource")).build());CacheManager cacheManager = ehcacheProvider.getCacheManager(ehcacheProvider.getDefaultURI(), configuration);createCache(cacheManager, com.ehc.generated.repository.UserRepository.USERS_BY_LOGIN_CACHE);createCache(cacheManager, com.ehc.generated.repository.UserRepository.USERS_BY_EMAIL_CACHE);jCacheCacheManager = new JCacheCacheManager(cacheManager);}@Beanpublic HibernatePropertiesCustomizer hibernatePropertiesCustomizer(CacheManager cacheManager) {return hibernateProperties -> hibernateProperties.put(ConfigSettings.CACHE_MANAGER, cacheManager);}@Beanpublic org.springframework.cache.CacheManager cacheManager() {return jCacheCacheManager;}@Beanpublic CacheManager cacheManagers() {return jCacheCacheManager.getCacheManager();}private void createCache(javax.cache.CacheManager cm, String cacheName) {javax.cache.Cache<Object, Object> cache = cm.getCache(cacheName);if (cache == null) {cm.createCache(cacheName, jcacheConfiguration);}}
}

首先,我是单独写的一个Configuration来配置Cache,我把disk的配置comment了,因为disk和cluster只能配置一个,不能同时配置.我一开始配置的时候忘记了,启动的时候一直报错,突然想起来才comment掉了disk.

这里我配置了一个heap层一个cluster层.

还需要注意一点就是,heap层不需要序列化和反序列化,所以,当只配置heap层时,不需要序列化(因为heap是默认用 by-reference.当然也可以用 copiers 来设置,就是实现Copier的接口,让他用key-value的形式),但是一旦配置了除开heap的其他层(例如 offheap,disk,cluster),这时候的key和value必须时可序列化的,否则就会报错.

这是除了cluster的其他3个层的简介.

    jcacheConfiguration = Eh107Configuration.fromEhcacheCacheConfiguration(CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, User.class,ResourcePoolsBuilder.heap(10)// .disk(10, MemoryUnit.MB, true).with(ClusteredResourcePoolBuilder.clusteredShared("resource-pool-a"))).withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(3600))).build());

这段代码是对每个Name的Cache的通用配置,当然你也可以每个Name的Cache单独进行配置,我只是为了方便演示做的同一配置. 我这里配置了heap层可以容纳10条缓存,cluster 使用 resource-pool-a这个shared池 (当其他集群中的inst也使用这个share池时,就相当于共享缓存了,虽然文档上的解释是他们依然是相互独立的,只不过是底层储存共享了,但是你也可以直接理解成共享),还配置了TTL,一小时后超时.

重点

这之前的配置在其他文档或者很多Blog中都可以查到,但是之后的配置让我头疼了很久,所有Blog中都没有关于cacheManager层的配置.

PersistentCacheManager persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder() .with(CacheManagerBuilder.persistence(new File(getStoragePath(), "myData"))) .withCache("persistent-cache", CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class,ResourcePoolsBuilder.newResourcePoolsBuilder().disk(10, MemoryUnit.MB, true)) ).build(true);

因为在文档中,对与cacheMannager层的配置,都是使用CacheManagerBuilder在build之前使用with进行配置,比如上面的代码,配置了disk 的持久化文件目录.

CachingProvider provider = Caching.getCachingProvider();
CacheManager cacheManager = provider.getCacheManager();

然而JSR-107的cacheManager是直接从cacheProvider中直接get出来的,这个配置到底怎么放进去? 这个问题我都快把搜索引擎搜烂了都没有找到. stackoverflow 提问题也没人回答.

直到后来在文档中,刚好有小小的一段提到了这个.结束了我头痛的路程.

     CachingProvider cachingProvider = Caching.getCachingProvider();EhcacheCachingProvider ehcacheProvider = (EhcacheCachingProvider) cachingProvider;DefaultConfiguration configuration = new DefaultConfiguration(ehcacheProvider.getDefaultClassLoader(),// new DefaultPersistenceConfiguration(new File("D:/training/EHCache/cache")),ClusteringServiceConfigurationBuilder.cluster(URI.create("terracotta://localhost:9410/clustered")).autoCreate(c -> c.defaultServerResource("default-resource").resourcePool("resource-pool-a", 10,MemoryUnit.MB, "default-resource")).build());CacheManager cacheManager = ehcacheProvider.getCacheManager(ehcacheProvider.getDefaultURI(), configuration);


我们看DefaultConfiguration的源码,它可以支持多个配置,如果disk和cluster可以同时配置的话,就直接可以把我comment的代码打开就行了,配置了cluster的 默认资源,以及给stare池分配10M的空间,以及配置disk持久化目录 .

.disk(10, MemoryUnit.MB, true)

这里需要注意的一点是,disk方法的第三个参数可配可不配,如果不配默认为false,代表不会持久化,JVM启动时,cache会写入配置的持久化目录,当JVM停止时,它会把它莫除掉,如果配置了true,才会真正的持久化,JVM停止时不会抹除,第二次重新启动时回去加载它.

这是集群中,一些关键词的解释.

还有一个点就是定义了两个,CacheManger的bean.原因是JSR-107需要一个 javax.cache.CacheManager , 而Spring-Boot-Cache 则需要一个 org.springframework.cache.CacheManager 的bean.

Terracotta Server Deploy

https://github.com/ehcache/ehcache3/releases


我是win10环境,就下的ZIP.


它的配置文件默认在server/conf下


启动的batch/shell默认在server/bin下,这里面的tc-config.xml默认时没有的,这是我放进去的.

配置了一个名叫default-resource的offheap的资源.启动在9410, URI为 terracotta://localhost:9410/clustered

<?xml version="1.0" encoding="UTF-8" ?>
<tc-config xmlns="http://www.terracotta.org/config"xmlns:ohr="http://www.terracotta.org/config/offheap-resource"xmlns:data="http://www.terracottatech.com/config/data-roots"xmlns:persistence="http://www.terracottatech.com/config/platform-persistence"><plugins><config><ohr:offheap-resources><ohr:resource name="default-resource" unit="MB">512</ohr:resource></ohr:offheap-resources></config></plugins><servers><server host="localhost" name="clustered"><tsa-port>9410</tsa-port><logs>terracotta/server-logs</logs></server></servers><failover-priority><availability/></failover-priority>
</tc-config>

start-tc-server.bat ./tc-config.xml 强制使用当前目录的config.xml跑start的bat,当看到红线的一段话,代表Terracotta Server启动成功了.

这时候再去启动项目,看到这个表示集群链接成功

Spring-Boot 使用JSR-107集成EHCache3.x (配置Clustered以及DISK)相关推荐

  1. Spring Boot 内置Tomcat——集成PHP解决方案

    Demo:https://gitee.com/shentuzhigang/mini-project/tree/master/springboot-embed-tomcat-php-demo 问题分析 ...

  2. Spring Boot 模板引擎FreeMarker集成

    Spring Boot 模板引擎FreeMarker集成 一.FreeMaker介绍 FreeMarker是一款免费的Java模板引擎,是一种基于模板和数据生成文本(HMLT.电子邮件.配置文件.源代 ...

  3. 从服务器基础环境配置到搭建Docker+Gitlab+Gitlab Runner,完整介绍Spring Boot项目的持续集成与持续交付具体实现!

    1. 序言 在大学的课程学习,非常注重团队协作的培养,在企业开发中,团队协作开发项目的场景更是甚多.另外,在当下的热门技术栈中,微服务开发模式.前后端分离开发模式逐渐盛行,Spring Boot.VU ...

  4. Spring Boot (三)集成spring security

    项目GitHub地址 : https://github.com/FrameReserve/TrainingBoot Spring Boot (三)集成spring security,标记地址: htt ...

  5. Spring Boot (二)集成Mybatis、Druid

    项目GitHub地址 : https://github.com/FrameReserve/TrainingBoot Spring Boot (二)集成Mybatis.Druid,标记地址: https ...

  6. Spring Boot 1.5.8集成Swagger2 + YApi —— Swagger常用注解说明

    前言 受新型冠状病毒的影响,在家像猪一样不是睡就是吃,闲着就学着用下Swagger和YApi,特将这几天的学习成果写成了这系列的文章,希望能对大家有所帮助.武汉加油,中国加油! Spring Boot ...

  7. Spring Boot下Druid连接池的使用配置分析

    引言: 在Spring Boot下默认提供了若干种可用的连接池,Druid来自于阿里系的一个开源连接池,在连接池之外,还提供了非常优秀的监控功能,这里讲解如何与Spring Boot实现集成. 1.  ...

  8. CSE 支持spring 4/5 以及spring boot 1/2 maven组件依赖关系配置参考

    [摘要] 本文介绍了CSE如何使用Spring 4或者Spring 5,以及在Spring Boot 1和Spring Boot 2中如何集成CSE,重点介绍了CSE提供的maven管理器,以及如何使 ...

  9. Spring Boot 2.4版本前后的分组配置变化及对多环境配置结构的影响

    前几天在<Spring Boot 2.4 对多环境配置的支持更改>一文中,给大家讲解了Spring Boot 2.4版本对多环境配置的配置变化.除此之外,还有一些其他配置变化,所以今天我们 ...

最新文章

  1. 2016年度工作总结
  2. 「创式纪」人工智能应用创新大赛启动,首次结合商业计划和机器学习
  3. Office Word 2007下管理参考文献(比2003版的交叉引用神马的轻松多拉)(转)
  4. objective-c 类目(Category)和延展(Extension)
  5. Office 365 Outlook Web App 移动设备体验
  6. .net WebApi 开发中某些注意事项
  7. 在移动端项目中使用vconsole
  8. linux下weblogic12c建域,三、WebLogic 12C集群部署-创建域
  9. Chrome 开发工具之 Memory
  10. 转:在Linux中Oracle安装成功后,首次启动使用时,会出现的一些问题总结和解决办法...
  11. 三、Oracle 游标、存储过程、存储函数、触发器
  12. 实现MFC扩展DLL中导出类和对话框
  13. 测试了MySQL实时监控工具Nero Profile SQL
  14. linux vi命令的查询,linux vi命令模式详解
  15. <C语言程序实例>C语言实现菱形输出
  16. 【Day5.7】美食街实在吃不下去,回暹罗商圈再晚餐
  17. 微信小程序等第三方应用接入易班的api
  18. Single Threaded Execution Pattern
  19. TPMS胎压芯片选择:英飞凌SP370、英飞凌SP40、飞思卡尔FXTH87
  20. python PIL增强或降低图像对比度

热门文章

  1. 锤子科技官网:问题整理及注意事项
  2. hybris FlexibleSearch
  3. 函数表达式-JS高程
  4. oblog为何继续采用js+html
  5. jquery选择器动态拼接
  6. 《预训练周刊》第29期:Swin Transformer V2:扩大容量和分辨率、SimMIM:用于遮蔽图像建模的简单框架
  7. 使用小乌龟TortoiseGit解决代码冲突问题
  8. 熬了几个通宵,终于把初中到大学的数学知识梳理完了(学习算法必备数学知识)
  9. 独立按键检测短按、长按,松手后响应操作
  10. 大连第9家外资银行渣打银行大连分行争取年内开业