mybatis13--2级缓存
验证内置的2级缓存
Ehcache缓存的配置
01.引入需要的ehcache 和mybatis-ehcache 两个jar包
02.在mapper文件中增加 <cache type="org.mybatis.caches.ehcache.EhcacheCache"/> <!-- 配置Ehcache缓存 -->
org.mybatis.caches.ehcache.EhcacheCache就是在mybatis-ehcache这个jar包中
03.引入需要的ecache.xml文件 就在ecache.jar中
创建对应的dao

- public interface StudentDao {
- /**
- * 验证mybatis2级缓存!
- */
- Student selectStudentById(Integer sId);
- }

创建对应的mapper文件

- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE mapper
- PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-Mapper.dtd">
- <mapper namespace="cn.bdqn.dao.StudentDao">
- <cache/> <!-- 配置2级缓存 -->
- <select id="selectStudentById" resultType="Student">
- select sid,sname from student where sid=#{xxx}
- </select>
- </mapper>

实体类实现Serializable序列化接口

- /**
- *学生对应的实体类
- */
- public class Student implements Serializable {
- private Integer sId;
- private String sName;
- public Integer getsId() {
- return sId;
- }
- public void setsId(Integer sId) {
- this.sId = sId;
- }
- public String getsName() {
- return sName;
- }
- public void setsName(String sName) {
- this.sName = sName;
- }
- public Student(Integer sId, String sName) {
- super();
- this.sId = sId;
- this.sName = sName;
- }
- public Student() {
- super();
- }
- @Override
- public String toString() {
- return "Student [sId=" + sId + ", sName=" + sName +"]";
- }
- }

把log4j的配置文件中的显示改成
增加测试类代码

- package cn.bdqn.test;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import org.apache.ibatis.session.SqlSession;
- import org.junit.After;
- import org.junit.Before;
- import org.junit.Test;
- import cn.bdqn.bean.Student;
- import cn.bdqn.dao.StudentDao;
- import cn.bdqn.util.SessionUtil;
- public class TeacherTest {
- StudentDao dao;
- SqlSession session;
- @Before
- public void before() {
- // 因为需要关闭session 需要把session提取出去
- session = SessionUtil.getSession();
- dao = session.getMapper(StudentDao.class);
- }
- @After
- public void after() {
- if (session != null) {
- session.close();
- }
- }
- /**
- * 验证2级缓存
- *
- * 开启内置2级缓存的步骤
- * 01.实体类对象 要实现serializable 序列化接口
- * 02.在mapper文件中 增加 <cache/>节点
- */
- @Test
- public void test1() {
- Student student = dao.selectStudentById(1);
- System.out.println(student);
- session.close(); //关闭了session 一级缓存中的数据肯定清空了
- session = SessionUtil.getSession(); //再次获取session 查询数据
- dao = session.getMapper(StudentDao.class);
- //这时候不会再有sql语句了 因为2级缓存中存在相同的查询(mapper文件中sql的id)和相同的sql语句
- Student student2 = dao.selectStudentById(1);
- System.out.println(student2);
- }
- }

查看运行的结果
验证增删改对2级缓存的影响
在dao中新增方法

- public interface StudentDao {
- /**
- * 验证mybatis2级缓存!
- */
- Student selectStudentById(Integer sId);
- /**
- * 验证增删改查对2级缓存的影响!
- */
- void addStudent(Student student);
- }

在mapper文件中新增

- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE mapper
- PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-Mapper.dtd">
- <mapper namespace="cn.bdqn.dao.StudentDao">
- <cache/> <!-- 配置2级缓存 -->
- <select id="selectStudentById" resultType="Student">
- select sid,sname from student where sid=#{xxx}
- </select>
- <!-- 新增一个学生 验证对2级缓存的影响 标签中 增加 flushCache="false" 可以设置在新增数据的时候不刷新2级缓存
- 但是一级缓存不能配置 也就是 只要是一级缓存的增删改 都会刷新 -->
- <insert id="addStudent"> insert into student values(#{sId},#{sName}) <!--#{sId},#{sName} 对应的是实体类中的属性 --></insert></mapper>

在测试类中新增

- /**
- * 验证增删改对2级缓存的影响
- */
- @Test
- public void test2() {
- Student student = dao.selectStudentById(1);
- System.out.println(student);
- session.close(); //关闭了session 一级缓存中的数据肯定清空了
- session = SessionUtil.getSession(); //再次获取session 查询数据
- dao = session.getMapper(StudentDao.class);
- //新增学生信息 看看对2级缓存的影响
- dao.addStudent(new Student(66,"测试"));
- Student student2 = dao.selectStudentById(1);
- System.out.println(student2);
- }

得到的结果:
2级缓存的关闭

- /**
- * 2级缓存的关闭
- * 01.局部关闭
- * 在mapper文件中修改
- * <select id="selectStudentById" useCache="false" resultType="Student">
- * 增加了useCache="false" 相当于 局部关闭 2级缓存 useCache默认值为true===》把查询放入2级缓存
- * 02.全局关闭
- * 在mybatis.xml文件中增加
- * <settings>
- * <!--全局关闭2级缓存 -->
- * <setting name="cacheEnabled" value="false"/>
- * </settings>
- */
- @Test
- public void test3() {
- Student student = dao.selectStudentById(1);
- System.out.println(student);
- session.close(); //关闭了session 一级缓存中的数据肯定清空了
- session = SessionUtil.getSession(); //再次获取session 查询数据
- dao = session.getMapper(StudentDao.class);
- //这时候不会再有sql语句了 因为2级缓存中存在相同的查询(mapper文件中sql的id)和相同的sql语句
- Student student2 = dao.selectStudentById(1);
- System.out.println(student2);
- }
- /**
- * 2级缓存的使用原则:
- * 01. 很少被修改的数据
- * 02. 不是很重要的数据,允许出现偶尔并发的数据
- * 03. 不会被并发访问的数据
- * 04.多个namespace不能操作同一张表
- * 05.不能在关联关系表上执行增删改操作
- */
mybatis13--2级缓存的更多相关文章
- 缓存篇(Cache)~第三回 HttpModule实现网页的文件级缓存
返回目录 再写完缓存篇第一回之后,得到了很多朋友的好评和来信,所以,决定加快步伐,尽快把剩下的文章写完,本篇是第三回,主要介绍使用HttpModule实现的文件级缓存,在看本文之前,大家需要限度Htt ...
- Hibernate-二级缓存策略
二级缓存的策略 当多个并发的事务同时访问持久化层的缓存中的相同数据时,会引起并发问题,必须采用必要的事务隔离措施. 在进程范围或集群范围的缓存,即第二级缓存,会出现并发问题.因此可以设定以下4种类型的 ...
- Hibernate-一级缓存session
hibernate提供的一级缓存 hibernate是一个线程对应一个session,一个线程可以看成一个用户.也就是说session级缓存(一级缓存)只能给一个线程用,别的线程用不了,一级缓存就是和 ...
- Spring+ehcache+redis两级缓存
问题描述 场景:我们的应用系统是分布式集群的,可横向扩展的.应用中某个接口操作满足以下一个或多个条件: 1. 接口运行复杂代价大, 2. 接口返回数据量大, 3. 接口的数据基本不会更改, 4. 接口 ...
- mybatis学习笔记(14)-查询缓存之中的一个级缓存
mybatis学习笔记(14)-查询缓存之中的一个级缓存 标签: mybatis mybatis学习笔记14-查询缓存之中的一个级缓存 查询缓存 一级缓存 一级缓存工作原理 一级缓存測试 一级缓存应用 ...
- 用guava快速打造两级缓存能力
首先,咱们都有一共识,即可以使用缓存来提升系统的访问速度! 现如今,分布式缓存这么强大,所以,大部分时候,我们可能都不会去关注本地缓存了! 而在一起高并发的场景,如果我们一味使用nosql式的缓存,如 ...
- Redis+Caffeine两级缓存,让访问速度纵享丝滑
原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 在高性能的服务架构设计中,缓存是一个不可或缺的环节.在实际的项目中,我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中, ...
- 基于Spring接口,集成Caffeine+Redis两级缓存
原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 在上一篇文章Redis+Caffeine两级缓存,让访问速度纵享丝滑中,我们介绍了3种整合Caffeine和Redis作为两级缓存使用的方法,虽 ...
- Spring的3级缓存和循环引用的理解
此处是我自己的一个理解,防止以后忘记,如若那个地方理解不对,欢迎指出. 一.背景 在我们写代码的过程中一般会使用 @Autowired 来注入另外的一个对象,但有些时候发生了 循环依赖,但是我们的代码 ...
随机推荐
- 大数据学习环境搭建(CentOS6.9+Hadoop2.7.3+Hive1.2.1+Hbase1.3.1+Spark2.1.1)
node1 192.168.1.11 node2 192.168.1.12 node3 192.168.1.13 备注 NameNode Hadoop Y Y 高可用 DateNode Y Y Y R ...
- 毕业论文Word格式技巧
word利用多级列表功能实现章节标题自动编号 坑:在选择级别1后,直接在当前对话框直接继续设置级别2:然后选中级别2,设置相应的格式,主要在将级别链接到样式处选择为标题2,然后要在库中显示的级别选择级 ...
- ES6 与 React
Node和NPM/*安装npm*/npm installnpm install <package>npm install -g <package> /*更新安装包*/npm u ...
- HashMap代码解析
hashmap (jdk 1.7)使用 “数组-链表” 方式进行存储,图形化表示如下: 即,前面是一个数组,后面跟一个链表,那么数据结构这个对应到HashMap的代码里面是什么样子的呢? 在HashM ...
- 使用elasticsearch分页时报max_result_window is too large的错误解决方案
使用elasticsearch进行深度分页查询时的size-from大于10000的时候,会提示一个max_result_window is too large的错误. 官方推荐是scroll查询返回 ...
- InfluxDB服务器启动流程
操作系统 : CentOS7.3.1611_x64 go语言版本:1.8.3 linux/amd64 InfluxDB版本:1.1.0 源码路径: github.com/influxdata/infl ...
- Linux基础知识之用户和用户组以及 Linux 权限管理
已经开始接触Linux用户管理,用户组管理,以及权限管理这几个逼格满满的关键字.这几个关键字对于前端程序猿的我来说真的是很高大上有木有,以前尝试学 Linux 的时候看到这些名词总是下意识的跳过不敢看 ...
- Git忽略规则.gitignore忽略node_modules文件夹
在项目文件夹里添加.gitignore的文件 打开文件,在里面添加 /node_modules
- myeclipse16怎么去掉项目中的CodeLive Panel?
http://www.jb51.net/softjc/524823.html —————————————————————————————————————————————————— 在Servers视图 ...
- Kafka Eagle Consumers不显示
原因: kafka.eagle.offset.storage配置有误 该配置的作用:# kafka offset storage -- Offset stored in a Kafka cluster ...