什么是EhCache 缓存

news2024/9/20 18:01:52

EhCache 缓存-提高检索效率的利器

缓存-官方文档

文档地址: https://mybatis.org/mybatis-3/zh/sqlmap-xml.html#cache

EhCache 缓存

配置文档: https://www.cnblogs.com/zqyanywn/p/10861103.html

基本介绍

  1. EhCache 是一个纯Java 的缓存框架,具有快速、精干等特点。
  2. MyBatis 有自己默认的二级缓存(前面我们已经使用过了),但是在实际项目中,往往使用的是更加专业的第三方缓存产品作为MyBatis 的二级缓存,EhCache 就是非常优秀的缓存产品。

配置和使用EhCache

  1. 加入相关依赖, 修改pom.xml
<dependencies>
        <!--引入ehcache核心库/jar-->
        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache-core</artifactId>
            <version>2.6.11</version>
        </dependency>
        <!--引入需要使用的slf4j-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <!--引入mybatis整合ehcache库/jar-->
        <dependency>
            <groupId>org.mybatis.caches</groupId>
            <artifactId>mybatis-ehcache</artifactId>
            <version>1.2.1</version>
        </dependency>
 </dependencies>
  1. mybatis-config.xml 仍然打开二级缓存
<settings>
<!-- 开启二级缓存,默认就是打开-->
<setting name="cacheEnabled" value="true"/>
</settings>
  1. 加入src\main\resources\ehcache.xml 配置文件
    文档说明: https://www.taobye.com/f/view-11-23.html
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
    <!--
       diskStore:为缓存路径,ehcache分为内存和磁盘两级,此属性定义磁盘的缓存位置。参数解释如下:
       user.home – 用户主目录
       user.dir  – 用户当前工作目录
       java.io.tmpdir – 默认临时文件路径
     -->
    <diskStore path="java.io.tmpdir/Tmp_EhCache"/>
    <!--
       defaultCache:默认缓存策略,当ehcache找不到定义的缓存时,则使用这个缓存策略。只能定义一个。
     -->
    <!--
      name:缓存名称。
      maxElementsInMemory:缓存最大数目
      maxElementsOnDisk:硬盘最大缓存个数。
      eternal:对象是否永久有效,一但设置了,timeout将不起作用。
      overflowToDisk:是否保存到磁盘,当系统宕机时
      timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
      timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
      diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
      diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
      diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
      memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
      clearOnFlush:内存数量最大时是否清除。
      memoryStoreEvictionPolicy:可选策略(清除策略)有:LRU(最近最少使用,默认策略)、FIFO(先进先出)、LFU(最少访问次数)。
      FIFO,first in first out,这个是大家最熟的,先进先出。
      LFU, Less Frequently Used,就是上面例子中使用的策略,直白一点就是讲一直以来最少被使用的。如上面所讲,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。
      LRU,Least Recently Used,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
   -->
    <defaultCache
            eternal="false"
            maxElementsInMemory="10000"
            overflowToDisk="false"
            diskPersistent="false"
            timeToIdleSeconds="1800"
            timeToLiveSeconds="259200"
            memoryStoreEvictionPolicy="LRU"/>

</ehcache>
  1. 在XxxMapper.xml 映射文件启用EhCache , 当然原来MyBatis 自带的缓存配置就注销了

        <!--配置/启用ehcache-->
        <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    
  2. 修改MonsterMapperTest.java , 增加测试方法, 完成测试。
    测试ehCache缓存使用效果

        @Test
        public void ehCacheTest() {
    
            //查询id=3的monster
            Monster monster = monsterMapper.getMonsterById(3);
            //会发出SQL, 到db查询
            System.out.println("monster=" + monster);
    
            //这里关闭sqlSession, 一级缓存[数据]失效.=> 将数据放入到二级缓存 (ehcache)
            if (sqlSession != null) {
                sqlSession.close();
            }
    
            //重新获取sqlSession
            sqlSession = MyBatisUtils.getSqlSession();
            //重新获取了monsterMapper
            monsterMapper = sqlSession.getMapper(MonsterMapper.class);
            //再次查询id=3的monster
            System.out.println("--虽然前面关闭了sqlSession,因为配置二级缓存(ehcache), " +
                    "当你再次查询相同的id时, 不会再发出sql, 而是从二级缓存(ehcache)获取数据----");
            Monster monster2 = monsterMapper.getMonsterById(3);
            System.out.println("monster2=" + monster2);
    
            //再次查询id=3的monster, 仍然到二级缓存(ehcache), 获取数据, 不会发出sql
            Monster monster3 = monsterMapper.getMonsterById(3);
            System.out.println("monster3=" + monster3);
    
            if (sqlSession != null) {
                sqlSession.close();
            }
    
        }
    

EhCache 缓存-细节说明

如何理解EhCache 和MyBatis 缓存的关系

  1. MyBatis 提供了一个接口Cache【如下图,找到org.apache.ibatis.cache.Cache ,关联源码包就可以看到Cache 接口】。

  1. 只要实现了该Cache 接口,就可以作为二级缓存产品和MyBatis 整合使用,Ehcache 就是实现了该接口。

  2. MyBatis 默认情况(即一级缓存)是使用的PerpetualCache 类实现Cache 接口的,是核心类。

  3. 当我们使用了Ehcahce 后,就是EhcacheCache 类实现Cache 接口的,是核心类。


5. 我们看一下源码,发现缓存的本质就是Map<Object,Object>。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/820897.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GORM 并发执行 Save 更新记录报:Error 1062 (23000)

文章目录 1.Save 简介2.问题3.原因4.小结参考文献 1.Save 简介 先看一下 Save 方法的描述&#xff1a; // Save updates value in database. If value doesnt contain a matching primary key, value is inserted. func (db *DB) Save(value interface{}) (tx *DB)Save 有两个…

lc1109.航班预定统计

暴力解法&#xff1a;按照示例在firsti到lasti遍历&#xff0c;将seati加到每个数上。时间复杂度取决于bookings的长度 一维差分&#xff1a;建立初始数组和差分数组&#xff0c;在差分数组的firsti位置加上seati&#xff0c;差分数组的lasti1位置减去seati&#xff08;避免影…

偶数科技发布实时湖仓数据平台Skylab 5.3版本

近日&#xff0c; 偶数发布了最新的实时湖仓数据平台 Skylab 5.3 版本。Skylab包含七大产品&#xff0c;分别为云原生分布式数据库 OushuDB、数据分析与应用平台 Kepler、数据资产管理平台 Orbit、自动化机器学习平台 LittleBoy、数据工厂 Wasp、数据开发与调度平台 Flow、系统…

vscode如何包含第三方库

方法1&#xff1a;使用C Extension 在include 的 rapidjson的头文件时&#xff0c;vscode会提示找不到的问题 悬停&#xff0c;点击黄色提示 Edit "includePath" setting Include Path&#xff0c;输入rapidjson的include路径 /Users/xxx/workspaces/rapidjson-1.1.…

服务器出入口IP通俗理解

一、出口IP 这是机房的网络设备&#xff08;如防火墙&#xff09;给内网主机生成的一个外网IP&#xff0c;用来保证内网主机能和其他公网主机进行来回通信&#xff0c;通常作为其他接入方的IP白名单使用&#xff0c;一般有几台内网主机就有几个出口IP&#xff0c;出口IP通常和入…

TSINGSEE青犀视频AI算法引擎中台在渣土车智慧管控场景中的应用

一、行业背景 随着社会的发展和人们生活水平的不断进步&#xff0c;大家对环境卫生和空气质量的要求越来越重视。渣土车是建筑垃圾的运输主力&#xff0c;也存在行驶频繁、不合规、不合法的操作&#xff0c;可能对交通安全、环境卫生和城市形象造成影响。比如在施工工地&#x…

Django音乐电台推荐系统【纯干货分享,免费领源码00750】

摘要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作规…

【云原生】K8S超详细概述

目录 一、Kubernets概述1.1 K8S什么1.2为什么要用K8S 二、Kubernetes 集群架构与组件2.1Master组件Kube-apiserverKube-controller-managerKube-scheduler 2.2 配置存储中心etcd 2.3 Node 组件KubeletKube-Proxydocker 或 rocket 三、 Kubernetes 核心概念3.1Pod3.2Pod 控制器K…

WPF上位机5——C#运算符、特性、反射

C#运算符 按位操作 特性 预定义特性&#xff08;内置&#xff09; 自定义特性 通过特性获得数据表列的名称 反射 通过反射创建对象并调用对象的方法

【Vue组件eval方法的使用】

Vue页面中条件可以放在当前vue页面中而无需影响到组件 如 这是我的表格操作列按钮&#xff0c;需求是第四个按钮如果表格当前数据的is_execl字段为0则显示否则隐藏 这种条件判断很频繁 如果像之前一样给一个标识&#xff0c;页面多了就难以维护&#xff0c;而且判断条件如果不…

使用docker部署Wordpress

文章目录 1.创建网络2.创建volume存储3.拉取镜像4.创建mysql容器mysql修改密码 5.创建wordpress容器6.访问localhost:80就可以直接使用啦 1.创建网络 docker network create --subnet172.18.0.0/24 pro-net2.创建volume存储 # mysql 存储 docker volume create volume_mysql…

程序员成长之路心得篇——高效编码诀窍

随着AIGC的飞速发展&#xff0c;程序员越来越能够感受到外界和自己的压力。如何能够在AI蓬勃发展的时代不至于落后&#xff0c;不至于被替代&#xff1f;项目的开发效率起了至关重要的作用。 首先提出几个问题&#xff1a; 如何实现高效编程?高效编程的核心在于哪里&#xff…

无涯教程-Lua - 变量声明

变量的名称可以由字母&#xff0c;数字和下划线字符组成。它必须以字母或下划线开头&#xff0c;由于Lua区分大小写&#xff0c;因此大写和小写字母是不同的。 在Lua中&#xff0c;尽管无涯教程没有变量数据类型&#xff0c;但是根据变量的范围有三种类型。 全局变量(Global) …

功率信号源的输出阻抗是多大的

功率信号源是一种产生高功率信号的电子设备&#xff0c;它通常用于测试和测量、无线电通信、音频系统等领域。在实际应用中&#xff0c;功率信号源的输出阻抗对于整个电路的性能和准确性非常重要。 输出阻抗是指电路输出端产生的电阻值。在功率信号源中&#xff0c;输出阻抗通常…

【Linux详解】——进程间通信

&#x1f4d6; 前言&#xff1a;本期介绍进程间通信。 目录 &#x1f552; 1. 理解进程间通信&#x1f558; 1.1 什么是通信&#x1f558; 1.2 为什么要有通信&#x1f558; 1.3 如何进行进程间通信 &#x1f552; 2. 管道&#x1f558; 2.1 匿名管道&#x1f564; 2.1.1 回顾文…

SpringBoot2学习笔记

信息来源&#xff1a;https://www.bilibili.com/video/BV19K4y1L7MT?p5&vd_source3969f30b089463e19db0cc5e8fe4583a 作者提供的文档&#xff1a;https://www.yuque.com/atguigu/springboot 作者提供的代码&#xff1a;https://gitee.com/leifengyang/springboot2 ----…

自动化测试指南:什么该自动化什么不该自动化

除了测试&#xff0c;测试数据创建、需求跟踪和测试报告等任务也可自动化。 什么应该被自动化&#xff1f; 与人工测试相比&#xff0c;具备明显收益如果失败会对业务造成相当大的损失的业务功能或用户流&#xff1b;自动化测试有助于经常验证这些功能。 需要针对应用程序的每个…

myeclipse的Debug模式

1.表示当前实现继续运行直到下一个断点&#xff0c;快捷键为F8。 2.表示打断整个进程 3.表示进入当前方法&#xff0c;快捷键为F5。 4.表示运行下一行代码&#xff0c;快捷键为F6。 5.表示退出当前方法&#xff0c;返回到调用层&#xff0c;快捷键为F7。 6.表示当前线程的…

硬核来袭!中国AI大模型峰会“封神之作”,开发者们不容错过!

2023年全球AI浪潮迭起&#xff0c;大语言模型热度空前&#xff0c;生成式人工智能为千行百业高质量发展带来更多想象空间。作为前沿科技风向标、汇聚全球开发者的顶级盛会&#xff0c;WAVE SUMMIT 2023深度学习开发者峰会正式定档8月16日&#xff0c;在北京望京凯悦酒店召开。本…

PCB制版技术03

5.21 P(W)改变折线 5.22 点击右键可以拐弯&#xff0c;点击左键可以取消 5.23 这三个点&#xff0c;代表着连接在一起的意思 5.24 把这个电阻和线一连 5.25 点一下&#xff0c;然后把点给拉回来 5.26 连接三极管&#xff0c;十电阻 5.27 对齐和对称就能够感觉很舒服&#xff0c…