springboot3+EhCache3缓存+JDK17整合指南

作者: ʘᴗʘ发布时间:2023-01-28 13:10 浏览量:2698 点赞:2230 售价:0

背景

最近把本站的JDK版本从11升级到了17,springboot也升级到了3。之前coderbbb使用的是EhCache2+Springboot2的方案,所以需要升级到EhCache3+Springboot3。

首先,要明确一点,就是EhCache2和EhCache3可以说是完全不同的两个框架了。EhCache2有自己的一套缓存标准API,springboot2的cache部分整合了该API。但是到了EhCache3,并没有自己的API,而是实现了JCache。springboot3中,也不再有EhCacheCacheManager这个可以自动注入的类了。

综上所述,EhCache3和Springboot3的搭配使用,和之前有很大区别。本文将详细介绍具体整合步骤。

整合

下载依赖包

<dependency>
    <groupId>org.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>3.10.8</version>
</dependency>
<dependency>
    <groupId>javax.cache</groupId>
    <artifactId>cache-api</artifactId>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-core</artifactId>
    <version>2.3.0.1</version>
</dependency>
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>

<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.3.1</version>
</dependency>

第一个依赖包是EhCache3的依赖包,后面的几个主要是用于解析EhCache3的xml配置文件的。具体每个依赖的最新版本和作用,后面作者再更新。

appliaction.properties配置

第二步需要在springboot的application.properties中配置springboot cache选用哪种缓存实现(比如redis、jcache等等),以及配置文件位置。

spring.cache.type=jcache
spring.cache.jcache.config=classpath:ehcache3.xml #这个文件名可以自己定义

这里需要注意的是,缓存类型不再是EhCache了,EhCache3是实现JCache的一种缓存。

Ehcache3的xml文件配置

该配置文件比较简单,虽然和Ehcache2的配置文件完全不同,但参考代码中的注释,应该可以看懂。

<config xmlns='http://www.ehcache.org/v3'>
    <!-- 持久化 路径 -->
    <persistence directory="./tmp/Ehcache3"/>

    <!-- 缓存模版,此处为了显示其用法,也可以不用模版直接在cache中配置与模版参数相同 -->
    <cache-template name="oneHourTemplate">
<!--        <key-type>java.lang.String</key-type>-->
<!--        <value-type>java.lang.String</value-type>-->
        <expiry>
            <!-- 单位默认为秒当用秒作单位时,可以不填-->
            <ttl unit="hours">1</ttl>
        </expiry>
        <resources>
            <!-- 单位默认为entries当用entries作单位时,可以不填-->
            <heap>100</heap>
            <offheap unit="MB">5</offheap>
            <!-- persistent 默认为false可以不填-->
            <disk unit="MB">1024</disk>
        </resources>
    </cache-template>

    <cache-template name="tenMinutesTemplate">
<!--        <key-type>java.lang.String</key-type>-->
<!--        <value-type>java.lang.String</value-type>-->
        <expiry>
            <!-- 单位默认为秒当用秒作单位时,可以不填-->
            <ttl unit="minutes">10</ttl>
        </expiry>
        <resources>
            <!-- 单位默认为entries当用entries作单位时,可以不填-->
            <heap>100</heap>
            <offheap unit="MB">5</offheap>
            <!-- persistent 默认为false可以不填-->
            <disk unit="MB">1024</disk>
        </resources>
    </cache-template>

    <!-- 缓存对象,如果使用了模版会覆盖模版中的内容,使用uses-template=""来引用模版 -->
    <cache alias="indexArticleList" uses-template="oneHourTemplate">
<!--        <key-type>java.lang.Integer</key-type>-->
<!--        <value-type>com.github.pagehelper.PageInfo</value-type>-->
<!--        <expiry>-->
<!--            <!–此处会覆盖模版中的(TTL)配置 –>-->
<!--            <tti>60</tti>-->
<!--        </expiry>-->
<!--        <resources>-->
<!--            <disk unit="MB" persistent="true"> 500</disk>-->
<!--        </resources>-->
        <!-- 没有研究这块,暂时先不管
        <eviction-advisor></eviction-advisor>
        -->
    </cache>

    <cache alias="articleDetailsBig" uses-template="oneHourTemplate">
<!--        <key-type>java.lang.Long</key-type>-->
<!--        <value-type>com.coderbbb.blogv2.database.dto.WebsiteArticleDTO</value-type>-->
    </cache>
    <cache alias="cacheHtml" uses-template="oneHourTemplate" />
    <cache alias="articleDo" uses-template="tenMinutesTemplate">
<!--        <key-type>java.lang.Long</key-type>-->
<!--        <value-type>com.coderbbb.blogv2.database.dos.ArticleDO</value-type>-->
    </cache>
    <cache alias="articleKeywords" uses-template="oneHourTemplate">
<!--        <key-type>java.lang.Long</key-type>-->
<!--        <value-type>java.lang.String</value-type>-->
    </cache>
    <cache alias="websiteConfig" uses-template="oneHourTemplate">
<!--        <key-type>java.lang.String</key-type>-->
<!--        <value-type>com.coderbbb.blogv2.database.dos.WebsiteConfigDO</value-type>-->
    </cache>
    <cache alias="randomArticle" uses-template="oneHourTemplate">
<!--        <key-type>java.lang.Long</key-type>-->
<!--        <value-type>java.util.List</value-type>-->
    </cache>
    <cache alias="cacheUserAgent" uses-template="tenMinutesTemplate">
<!--        <key-type>java.lang.String</key-type>-->
<!--        <value-type>java.lang.Boolean</value-type>-->
    </cache>
    <cache alias="authorInfo" uses-template="oneHourTemplate" />
    <cache alias="relationArticleInfo" uses-template="oneHourTemplate" />
    <cache alias="userAnaData" uses-template="tenMinutesTemplate" />
    <cache alias="userCache" uses-template="tenMinutesTemplate" />
    <cache alias="indexTag" uses-template="oneHourTemplate" />
    <cache alias="hotArticle" uses-template="oneHourTemplate" />
    <cache alias="recentArticle" uses-template="oneHourTemplate" />
    <cache alias="hotBook" uses-template="oneHourTemplate" />


</config>

开始在springboot3中使用EhCache3

这一步和之前是一样的,通过springboot中的@Cacheable等注解,正常使用缓存即可。

运行截图

整合成功后,EhCache3的日志输出是远远多于EhCache2的。如下图所示,已经可以正常使用EhCache3啦!

springboot3+EhCache3缓存+JDK17整合指南

版权声明:《springboot3+EhCache3缓存+JDK17整合指南》为CoderBBB作者「ʘᴗʘ」的原创文章,转载请附上原文出处链接及本声明。

原文链接:https://www.coderbbb.com/articles/71

其它推荐:

  • 使用IntelliJ创建第一个简单的Springboot项目

    本文详细介绍了如何使用IntelliJ开发第一个Springboot项目,并打包成jar文件部署到生产环境。内容包括:IntelliJ的常用操作、Springboot多环境配置等常用操作介绍。

  • springboot使用redis限制并发请求、限流

    日常开发中经常会遇到需要限流、限制并发的需求,网上有很多算法、框架的介绍,但通常比较复杂,对于小项目来讲过于复杂。本文介绍了一种通过redis incr函数来实现的简便限流算法,并提供了完整源代码,可以快速的整合到你的项目中,实现API限流。

  • springboot整合thymeleaf完成第一个HTML网页

    在当前的HTML网页开发中,虽然Vue、React等框架非常流行,但是因为部分行业、网站对搜索引擎SEO的需求,传统的模板引擎仍有一席之地。本文继续使用上文生成的Demo工程,通过引入thymeleaf来完成我们的第一个网页。

  • springboot整合mybatis查询mysql数据库教程

    本文介绍如何在springboot中整合mybatis来查询mysql数据库,包括各种join查询、主键自动生成、复杂resultMap映射、in查询等,通过阅读本文可以掌握springboot+mybatis的常用各种语法。

  • HTML中javascript的<script>标签使用方法详解

    详细介绍了HTML网页中引入JavaScript的<script></script>标签的用法,逐一解释了其中async、charset、defer、language、src、type等属性的意义和用法。

  • 在手机上观看电脑上电影视频的办法

    如何在手机上远程播放电脑上的视频?本文作者开发了一个简单的播放器软件,可以将电脑上的视频在手机端播放,方便快捷。

  • java数组和List互相转化的最佳办法

    本文介绍了java代码中如何快速互相转换java list和java array。根据本教程介绍的方法,一行代码即可实现java list和array的互相转化。

  • nginx配置http请求301跳转https

    本文介绍如何使用nginx,将域名的http请求301跳转到https地址上。全网最简单配置,直接复制即可使用。

  • 【性能提升100倍】springboot+thymeleaf缓存html网页提高并发性能

    本文介绍了springboot+thymeleaf技术栈下生成HTML页面缓存的方法,将整个HTML网页缓存在内存、硬盘中,极大的提升了Springboot开发的web网站的并发性能,实测性能提升100倍以上。

  • 解析CSDN“登录后才能复制”功能技术原理

    本文是作者遇到CSDN“复制代码必须登录”的功能后,进行的一次技术探索,研究了CSDN是如何实现文章“防复制”的,并给出了更加安全牢固的反爬虫、反复制方案。

user

ʘᴗʘ

77
文章数
73826
浏览量
57446
获赞数
67.80
总收入