10_缓存-2_二级缓存

news2024/11/23 12:23:34

二级缓存是以namespace为标记的缓存,可以是由一个SqlSessionFactory创建的SqlSession之间共享缓存数据。默认并不开启。下面的代码中创建了两个SqlSession,执行相同的SQL语句,尝试让第二个SqlSession使用第一个SqlSession查询后缓存的数据。要求实体类必须实现序列化接口

接口

public interface EmpMapper {
    Emp findByEmpno(int empno);
}

映射文件

<mapper namespace="com.msb.mapper.EmpMapper">
    <cache/>
    <select id="findByEmpno" resultType="emp" useCache="true" flushCache="false">
        select * from emp where empno =#{empno}
    </select>
</mapper>

测试 代码

package com.msb.test;
import com.msb.mapper.EmpMapper;
import com.msb.pojo.Emp;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
/**
 * @Author: Ma HaiYang
 * @Description: MircoMessage:Mark_7001
 */
public class Test3 {
    private SqlSession sqlSession;
    private SqlSession sqlSession2;
    @Before
    public void init(){
        SqlSessionFactoryBuilder ssfb =new SqlSessionFactoryBuilder();
        InputStream resourceAsStream = null;
        try {
            resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        } catch (IOException e) {
            e.printStackTrace();
        }
        SqlSessionFactory factory=ssfb.build(resourceAsStream) ;
        sqlSession=factory.openSession();
        sqlSession2=factory.openSession();
    }
    @Test
    public void testFindDeptByDetpno()   {
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Emp emp = mapper.findByEmpno(7521);
        System.out.println(emp);
        // SqlSession提交之后,才会将查询的结果放入二级缓存
        sqlSession.commit();
        EmpMapper mapper2 = sqlSession2.getMapper(EmpMapper.class);
        Emp emp2 = mapper2.findByEmpno(7521);
        System.out.println(emp2);
    }
    @After
    public void release(){
        // 关闭SQLSession
        sqlSession.close();
        sqlSession2.close();
    }
}
 

注意其中的commit(),执行该命令后才会将该SqlSession的查询结果从一级缓存中放入二级缓存,供其他SqlSession使用。另外执行SqlSession的close()也会将该SqlSession的查询结果从一级缓存中放入二级缓存。两种方式区别在当前SqlSession是否关闭了。

执行结果显示进行了两次对数据库的SQL查询,说明二级缓存并没有开启。需要进行如下步骤完成开启。


1)    全局开关:在sqlMapConfig.xml文件中的<settings>标签配置开启二级缓存


<settings>

    <setting name="cacheEnabled" value="true"/>

</settings>

cacheEnabled的默认值就是true,所以这步的设置可以省略。

2)    分开关:在要开启二级缓存的mapper文件中开启缓存:


<mapper namespace="com.msb.mapper.EmployeeMapper">

    <cache/>
</mapper>

3)    二级缓存未必完全使用内存,有可能占用硬盘存储,缓存中存储的JavaBean对象必须实现序列化接口,


public class Emp implements  Serializable {  }

经过设置后,查询结果如图所示。发现第一个SqlSession会首先去二级缓存中查找,如果不存在,就查询数据库,在commit()或者close()的时候将数据放入到二级缓存。第二个SqlSession执行相同SQL语句查询时就直接从二级缓存中获取了。

注意:

1)    MyBatis的二级缓存的缓存介质有多种多样,而并不一定是在内存中,所以需要对JavaBean对象实现序列化接口。

2)    二级缓存是以 namespace 为单位的,不同 namespace 下的操作互不影响

3)    加入Cache元素后,会对相应命名空间所有的select元素查询结果进行缓存,而其中的insert、update、delete在操作是会清空整个namespace的缓存。

4)    cache 有一些可选的属性 type, eviction, flushInterval, size, readOnly, blocking。

<cache type="" readOnly="" eviction=""flushInterval=""size=""blocking=""/>

5)    如果在加入Cache元素的前提下让个别select 元素不使用缓存,可以使用useCache属性,设置为false。useCache控制当前sql语句是否启用缓存  flushCache控制当前sql执行一次后是否刷新缓存


 
<select id="findByEmpno" resultType="emp" useCache="true" flushCache="false">

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

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

相关文章

CTF Misc(1)图片隐写基础以及原理,覆盖了大部分题型

前言 在ctf比赛中&#xff0c;misc方向是必考的一个方向&#xff0c;其中&#xff0c;图片隐写也是最常见的题目类型&#xff0c;在本篇文章中&#xff0c;将教授以下内容 1.各种图片文件的头数据以及判断是什么类型的图片 2.png图片隐写 3.jpg图片隐写 4.gif图片隐写 5.bmp图…

Android---RecyclerView实现吸顶效果

目录 一、ItemDecoration 二、实现RecyclerView吸顶效果 1、实现一个简单的RecyclerView。 2、通过ItemDecoration画分割线 3、画出每个分组的组名 4、实现吸顶效果 完整demo 一、ItemDecoration ItemDecoration 允许应用给具体的 View 添加具体的图画或者 layout 的偏移…

论文投稿指南——中文核心期刊推荐(物理学)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

[附源码]计算机毕业设计Python的高校课程知识库(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

如何做好源代码防泄密

​ 一、前言 • 各类嵌入式研发及平台软件研发行业&#xff0c;都有自己的核心数据以及核心文档&#xff0c;用户数据等敏感信息&#xff0c;这些信息数据有以下共性&#xff1a; –属于核心机密资料&#xff0c;万一泄密会给造成恶劣影响 –核心数据类型多&#xff0c;有…

验证码是自动化的天敌?看看大神是怎么解决的

01 验证码 1、什么是验证码&#xff1a; 指一种随机生成的信息&#xff08;数字、字母、汉字、图片、算术题&#xff09;等为了防止恶意的请求行为&#xff0c;增加应用的安全性 自动化过程中也是需要进行注册或者登陆的操作&#xff0c;所以需要处理验证 2、验证码处理方式…

《第一堂棒球课》:MLB棒球创造营·棒球名人堂

铃木一朗&#xff0c;1973年10月22日出生于西春日井郡丰山町&#xff08;日本&#xff09;&#xff0c;日本职业棒球运动员&#xff0c;效力于美国职棒大联盟西雅图水手队。 1991年被欧力士蓝浪以第四指名选中&#xff0c;1994年以片假名&#xff08;Ichiro&#xff09;在一军…

记录一次并发问题的解决

并发问题的产生背景 该问题是在生产运行的过程中出现的。这个运行的项目是一个拉取第三方数据的一个服务&#xff0c;该服务会在拉取到数据之后直接将该数据直接插入到本地库&#xff0c;其中插入本地库的操作是调用的一个静态方法&#xff0c;静态方法对数据进行了多次数据处…

携程Apollo配置中心架构介绍

俗话说”麻雀虽小&#xff0c;五脏俱全“&#xff0c;有人说想看开源源码却不知道什么好&#xff0c;事实上&#xff0c;那些流行多年&#xff0c;广受好评的开源工程都是很值得一读的。今天我们介绍Apollo配置中心的基本情况&#xff0c;之所以介绍这个&#xff0c;主要是因为…

在线地图持续进化,BAT技术“鲜”发制人

配图来自Canva可画 眼下&#xff0c;在线地图正在成为智能穿戴、物流运输、旅游度假等诸多领域的“基础设施”&#xff0c;尤其是自动驾驶、车路协同等汽车细分赛道越来越重视在线地图的导入。 得益于此&#xff0c;在线地图市场持续走向火热。华经产业研究院数据显示&#x…

linux基础学习-ssh基础

ssh基础 通过SSH客户端我们可以连接到运行了SSH服务器的远程机器上 SSH客户端是一种使用Secure Shell(SSH)协议连接到远程计算机的软件程序目前较为可靠&#xff0c;专门为远程登录会话和其他网络服务提供安全性的协议 利用SSH协议可以有效防止远程管理过程中的信息泄露提供SS…

行业级开源无人机目标追踪,高空助力抓贼!

活久见&#xff01;成都一高楼惊险无人机抓小偷视频中危险动作&#xff0c;请勿模仿&#xff01; 本次实验中我们使用的是Prometheus 600&#xff08;P600&#xff09;行业级无人机研发平台&#xff08;此平台适用于无人机行业应用开发与室外环境下的无人机算法验证&#xff0…

White Rose设计与架构的想法分享

在七牛云校园黑客马拉松中&#xff0c;一款设计优秀、逻辑清晰的白板作品脱颖而出&#xff0c;获得第二名的好成绩&#xff0c;这就是来自郑州大学Since团队的White Rose白板&#xff0c;以下是他们的设计和架构分享。 一、前言 White Rose是参加七牛云hackathon比赛的作品&am…

【】Fate单机部署及代码调试全流程ongoing

这里写自定义目录标题Fate单机部署及代码调试全流程一、安装Linux系统或者虚拟机-Linux系统1、先装虚拟机2、在虚拟机上安装Ubuntu系统二、FATE单机部署并PyCharm如何连接远程服务器的docker容器进行运行和调试代码【整体未成功&#xff0c;可跳过】三、Ubuntu系统上安装anacon…

谈谈什么是才是InnoDB解决幻读的最佳方案

本文会分享一下MySQL的InnoDB引擎下的事务幻读问题与解决方案--LBCC&MVCC。经过好几天的熬夜通宵&#xff0c;终于把这部分的内容捋清楚了。至于为什么说是InnoDB呢&#xff1f;因为MyISAM引擎是不支持事务的。 事务 概念 一个事情由n个单元组成&#xff0c;这n个单元在…

Apache 虚拟主机里的 ServerName 指令

术语虚拟主机(Virtual host)是指在一台机器上运行多个网站&#xff08;例如 company1.example.com 和 company2.example.com&#xff09;的做法。 虚拟主机可以是“基于 IP”的&#xff0c;这意味着每个网站都有不同的 IP 地址&#xff0c;也可以是“基于名称的”&#xff0c;…

Springboot集成Neo4j

一、概述 1.为什么图形数据库&#xff1f; 生活在一个互联的世界中&#xff0c;大多数领域需要处理丰富的连接集以了解真正发生的事情。通常&#xff0c;我们发现项目之间的联系与项目本身一样重要。 虽然现有的关系数据库可以存储这些关系&#xff0c;但它们通过昂贵的JOIN操作…

微服务框架 SpringCloud微服务架构 服务异步通讯 50 消息可靠性 50.3 消费者消息确认

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 服务异步通讯 文章目录微服务框架服务异步通讯50 消息可靠性50.3 消费者消息确认50.3.1 消费者确认50 消息可靠性 50.3 消费者消息确认 50…

OTA前装搭载率逼近50%,哪些供应商正在领跑细分赛道

智能汽车的OTA&#xff0c;正在进入新发展周期。 早期的OTA&#xff0c;主要围绕座舱信息娱乐、T-BOX及少部分车内其他ECU&#xff0c;主要目的是修复软件Bug以及改进用户体验&#xff0c;降低整车的召回成本。这个阶段&#xff0c;OTA对应的整车电子架构还是以传统的分布式EC…

前端上传文件或者上传文件夹

文档 https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/input 上传文件夹&#xff0c;主要的参数webkitdirectory 浏览器上传文件夹&#xff0c;浏览器会弹出询问窗口 兼容性 https://caniuse.com/?searchwebkitdirectory 代码如下 <!-- 选择文件 -->…