1.接口

public interface MemberMapperCache {

    public Members selectMembersById(Integer id);

}

2.POJO类

实现序列化接口

public class Members implements Serializable {

    private static final long serialVersionUID = 1L;

    private Integer id;

    private String member_name;

    private Integer age;

    private Integer gender;

    private String email;

    public Members() {}

    public Members(Integer id, String member_name, Integer age, Integer gender, String email) {
super();
this.id = id;
this.member_name = member_name;
this.age = age;
this.gender = gender;
this.email = email;
} public Integer getId() {
return id;
} public String getMember_name() {
return member_name;
} public Integer getAge() {
return age;
} public Integer getGender() {
return gender;
} public String getEmail() {
return email;
} public void setId(Integer id) {
this.id = id;
} public void setMember_name(String member_name) {
this.member_name = member_name;
} public void setAge(Integer age) {
this.age = age;
} public void setGender(Integer gender) {
this.gender = gender;
} public void setEmail(String email) {
this.email = email;
} @Override
public String toString() {
return "Members [id=" + id + ", member_name=" + member_name + ", age=" + age + ", gender=" + gender + ", email=" + email + "]";
} }

3.mapper.xml配置

<?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="com.dao.MemberMapperCache">
<!--
eviction:缓存的回收策略
LRU:最近最少使用的,移除最长时间不被使用的对象
FIFO:先进先出,按对象进入缓存的顺序来移除他们
SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象
WEAK:弱引用,更积极的移除基于垃圾收集器状态和弱引用规则的对象
默认是LRU
flushInterval:缓存刷新间隔
默认不清空
readOnly:是否只读
true:只读:mybatis认为所有从缓存中获取数据的操作都是只读操作,不会修改数据
mybatis为了加快获取速度,直接将数据在缓存中的引用交给用户,不安全,但是速度快
false:非只读:mybatis觉得获取的数据可能会被修改,并会用序列化和反序列化技术克隆一份新的数据
再给用户,这样安全,但是速度相对慢
默认false,非只读
size:缓存中存放多少个元素
type:自定义缓存,实现Cache接口集合,type="全类名" ===>POJO必须实现序列化接口
--> <cache eviction="LRU" flushInterval="60000" readOnly="false" size="1024"></cache> <select id="selectMembersById" resultType="members"> select * from members where id = #{id} </select> </mapper>

4.全局配置文件

开启二级缓存和日志打印

    <settings>
<!-- 打印log日志 -->
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>

5.测试类

    /**
* Mybatis的缓存机制
* 二级缓存:
* 1.在全局配置文件中开启二级缓存
* 2.在mapper.xml文件中加入<cache><cache/>标签
* 3.POJO实现序列化接口
*/
public static void main(String[] args) throws IOException {
// 获取两个不同的session
SqlSession session1 = getSqlSession();
SqlSession session2 = getSqlSession();
try {
// 获取两个不同的mapper
MemberMapperCache mapper1 = session1.getMapper(MemberMapperCache.class);
MemberMapperCache mapper2 = session2.getMapper(MemberMapperCache.class);
// 获取id为1的对象
Members member1 = mapper1.selectMembersById(1);
System.out.println(member1.toString());
session1.close();
// 获取id为1的对象
Members member2 = mapper2.selectMembersById(1);
System.out.println(member2.toString());
session2.close();
} finally { }
} public static SqlSession getSqlSession() throws IOException {
// 读取全局配置文件
String resource = "conf/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 获取sqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 打开session
SqlSession session = sqlSessionFactory.openSession();
return session;
}

mybatis的二级缓存是namespace级别的缓存,也就是mapper级别的缓存,则mapper中所有的select语句默认都将被缓存,此命名空间下所有insert、update、delete语句将会导致空间下的缓存被清空

在单表操作的情况下用二级缓存是没什么问题的,但是在多关联中,用二级缓存就存在很大的风险,这里我百度搜了一下,有好多栗子,就不列举了,原链接是   https://www.cnblogs.com/liouwei4083/p/6025929.html

还是不推荐是用mybatis自带的缓存机制,还是在业务层用自己能控制的缓存比较稳妥

Mybatis二级缓存的简单应用的更多相关文章

  1. [原创]关于mybatis中一级缓存和二级缓存的简单介绍

    关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...

  2. 关于mybatis中一级缓存和二级缓存的简单介绍

    关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...

  3. 如何细粒度地控制你的MyBatis二级缓存(mybatis-enhanced-cache插件实现)

    前几天网友chanfish 给我抛出了一个问题,笼统地讲就是如何能细粒度地控制MyBatis的二级缓存问题,酝酿了几天,觉得可以写个插件来实现这个这一功能.本文就是从问题入手,一步步分析现存的MyBa ...

  4. MyBatis 二级缓存全详解

    目录 MyBatis 二级缓存介绍 二级缓存开启条件 探究二级缓存 二级缓存失效的条件 第一次SqlSession 未提交 更新对二级缓存影响 探究多表操作对二级缓存的影响 二级缓存源码解析 二级缓存 ...

  5. mybatis二级缓存应用及与ehcache整合

    mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓存. 1.开启mybatis的二级缓存 在核心配 ...

  6. 深入了解MyBatis二级缓存

    深入了解MyBatis二级缓存 标签: mybatis二级缓存 2015-03-30 08:57 41446人阅读 评论(13) 收藏 举报  分类: Mybatis(51)  版权声明:版权归博主所 ...

  7. MyBatis二级缓存配置

    正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 Mybatis二级缓存是SessionFactory,如果两次查询基于同一个SessionFactory,那么就从二级缓存 ...

  8. mybatis二级缓存

    二级缓存区域是根据mapper的namespace划分的,相同namespace的mapper查询数据放在同一个区域,如果使用mapper代理方法每个mapper的namespace都不同,此时可以理 ...

  9. Springboot整合Ehcache 解决Mybatis二级缓存数据脏读 -详细

    前面有写了一篇关于这个,但是这几天又改进了一点,就单独一篇在详细说明一下 配置 application.properties ,启用Ehcache # Ehcache缓存 spring.cache.t ...

随机推荐

  1. Spring之22:DefaultListableBeanFactory

    1. DefaultListableBeanFactory的作用: 默认实现了ListableBeanFactory和BeanDefinitionRegistry接口,基于bean definitio ...

  2. ajax后台跳转无效的原因

    Ajax只是利用脚本访问对应url获取数据而已,不能做除了获取返回数据以外的其它动作了.所以浏览器端是不会发起重定向的. 1)正常的http url请求,只有浏览器和服务器两个参与者.浏览器端发起一个 ...

  3. Ctex ERROR Reading

    提供一个"Ctex ERROR Reading"的处理办法 方法/步骤: 1. 再我们打开一些网上下载的文档的时候可能出现错误提示 2. 这种问题一般是文件编码的问题,我们需要选择 ...

  4. django使用pyecharts(4)----django加入echarts_增量更新

    四.Django 前后端分离_定时增量更新图表 1.安装 djangorestframework linux pip3 install djangorestframework windows pip ...

  5. EAFP vs LBYL

    EAFP vs LBYL 检查数据可以让程序更健壮,用术语来说就是防御性编程.检查数据的时候,有EAFP和LBYL两种不同的编程风格,具体的意思如下: LBYL: Look Before You Le ...

  6. VNC的使用

    1. 安装 rpm -ivh tigervnc-server--.el6.x86_64.rpm 如果rpm安装时发现有依赖,建议直接使用yum安装,轻松解决依赖问题: yum install tige ...

  7. Ubuntu 利用 mtd-utils 制作ubifs.img

    确保已经安装了有关的工具 sudo apt-get install mtd-utils mkfs.ubifs -d fs -m -o rootfslink.ubiimg -e -c -F -v syn ...

  8. spring中EL解析器的使用

    SpEL对表达式语法解析过程进行了很高的抽象,抽象出解析器.表达式.解析上下文.估值(Evaluate)上下文等对象,非常优雅的表达了解析逻辑.主要的对象如下: 类名 说明 ExpressionPar ...

  9. 在论坛中出现的比较难的sql问题:33(递归 连续日期问题 )

    原文:在论坛中出现的比较难的sql问题:33(递归 连续日期问题 ) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有必 ...

  10. vue混入 (mixin)的使用

    混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能.一个混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项. 使用示 ...