与Hibernate一样,MyBatis 也提供了一级缓存和二级缓存的支持。

1、一级缓存:(本地缓存)SqlSession级别的缓存,默认一直开启的 ,

与数据库同一次会话期间的数据会放到本地缓存中,以后如果需要相同的数据,直接从缓存中拿,不再查询数据库。

当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空。

    当进行增删改之后,该Session中的所有 Cache 就将清空。

2、二级缓存:基于namespace级别的缓存,一个namespace对应一个二级缓存

    可自定义存储源,如 Ehcache。

    当 Session flush 或 close 之后,二级缓存仍然可用。

    当进行增删改之后,该namespace的所有 Cache 就将清空。

    <setting name="cacheEnabled" value="false" />可关闭二级缓存,一级缓存可用。

一、一级缓存

package com.pjf.mybatis;

import java.io.IOException;
import java.io.InputStream;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.Test; import com.pjf.mybatis.dao.HotelMapper;
import com.pjf.mybatis.po.Hotel; public class TestHotel { public SqlSessionFactory sqlSessionFactory() throws IOException {
String resource = "mybatis_config.xml";
InputStream is = Resources.getResourceAsStream(resource);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
return sessionFactory;
}
/*
* Mybatis缓存机制
* 一级缓存:(本地缓存)SqlSession级别的缓存,默认一直开启的
* 与数据库同一次会话期间的数据会放到本地缓存中
* 以后如果需要相同的数据,直接从缓存中拿,不再查询数据库
* 一级缓存的失效情况(需要重新发送sql)
* 1、sqlSession不同
* 2、sqlSession相同,查询条件不同
* 3、sqlSession相同,查询条件相同,但两次查询之间执行了增删改操作
* 4、sqlSession相同,查询条件相同,手动清除了缓存clearCache()
*/ @Test
public void testMybatisCache() throws IOException { SqlSessionFactory sessionFactory = sqlSessionFactory();
SqlSession session = sessionFactory.openSession(true);
HotelMapper hotelMapper = session.getMapper(HotelMapper.class);
Hotel hotel = hotelMapper.getHotel(1001);
System.out.println(hotel);
//第二次查询,条件一致
Hotel hotel2 = hotelMapper.getHotel(1001);
System.out.println(hotel2);
session.close();
}
}

一级缓存在以下四种情况下会失效

1、sqlSession不同
2、sqlSession相同,查询条件不同
3、sqlSession相同,查询条件相同,但两次查询之间执行了增删改操作
4、sqlSession相同,查询条件相同,手动清除了缓存clearCache()

二、二级缓存

修改HotalMapper.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.pjf.mybatis.dao.HotelMapper">
<!-- cache 缓存开启
eviction 缓存回售策略
LRU 最近最少使用的,移除最长时间不被使用的(默认)
FIFO 先进先出
SOFT 软引用
WEAK 弱引用
flushInterval 缓存刷新间隔
缓存清空时间,默认不清空,设置毫秒值
readOnly 缓存是否只读
true mybatis只从缓存中毒数据,不会修改数据
false mybatis认为缓存中的数据会被修改,会用序列化和反序列化技术克隆一份给用户,安全,速度慢
size 缓存存放多少元素
type 指定自定义缓存的全类名
-->
<cache eviction="LRU" flushInterval="60000" readOnly="false" size="1024" ></cache> <resultMap type="com.pjf.mybatis.po.Hotel" id="myHotel">
<id column="id" property="id" jdbcType="INTEGER" />
<result column="hotel_name" property="hotelName" jdbcType="VARCHAR" />
<result column="hotel_address" property="hotelAddress"jdbcType="VARCHAR" />
<result column="price" property="price" jdbcType="INTEGER" />
</resultMap> <select id="getHotel" resultMap="myHotel">
select*
from hotel where id =#{id}
</select>
</mapper>

测试类

package com.pjf.mybatis;

import java.io.IOException;
import java.io.InputStream;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.Test; import com.pjf.mybatis.dao.HotelMapper;
import com.pjf.mybatis.po.Hotel; public class TestHotel { public SqlSessionFactory sqlSessionFactory() throws IOException {
String resource = "mybatis_config.xml";
InputStream is = Resources.getResourceAsStream(resource);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
return sessionFactory;
}
/*
* 二级缓存:基于namespace级别的缓存,一个namespace对应一个二级缓存
* 工作机制:
* 1、一个会话查询一个数据,这个数据会被保存到当前会话的一级缓存中
* 2、如果会话关闭,一级缓存中的数据会被保存到二级缓存中,新的会话消息,就可以查询二级缓存
* 3、不同namespace查出来的数据,会被放在自己对应的缓存中
* 使用:
* 1、开启全局二级缓存配置 <setting name="cacheEnabled" value="true" />
* 2、去mapper.xml配置使用二级缓存 <cache></cache>
* 3、pojo需要实现序列化接口
*/
@Test
public void testMybatisCache() throws IOException { SqlSessionFactory sessionFactory = sqlSessionFactory();
SqlSession session = sessionFactory.openSession(true);
HotelMapper hotelMapper = session.getMapper(HotelMapper.class);
Hotel hotel = hotelMapper.getHotel(1001);
System.out.println(hotel);
//关闭第一次会话
session.close();
//第二次查询
SqlSession session2 = sessionFactory.openSession(true);
HotelMapper hotelMapper2 =session2.getMapper(HotelMapper.class);
Hotel hotel2 = hotelMapper2.getHotel(1001);
System.out.println(hotel2);
session2.close();
}
}

二级缓存使用的时候主要有三步:

1、开启全局二级缓存配置   <setting name="cacheEnabled" value="true" />
2、去mapper.xml配置使用二级缓存 <cache></cache>
3、pojo需要实现序列化接口

mybatis学习(十)——缓存介绍的更多相关文章

  1. MyBatis学习--查询缓存

    简介 以前在使用Hibernate的时候知道其有一级缓存和二级缓存,限制ORM框架的发展都是互相吸收其他框架的优点,在Hibernate中也有一级缓存和二级缓存,用于减轻数据压力,提高数据库性能. m ...

  2. mybatis学习 十一 缓存

    1. 应用程序和数据库交互的过程是一个相对比较耗时的过程2. 缓存存在的意义:让应用程序减少对数据库的访问,提升程序运行效率3. MyBatis 中默认 SqlSession 缓存(一级缓存)开启 同 ...

  3. Mybatis学习笔记-缓存

    简介 什么是缓存 **将一次查询的结果暂存至内存,后续查询只需查询缓存** 为什么使用缓存 **减少与数据库的交互次数,减少系统开销,提高系统效率** 什么样的数据能使用缓存 **经常查询且不常修改的 ...

  4. mybatis学习 十二 多表查询

    Mybatis 实现多表查询方式: (1)业务装配.对两个表编写单表查询语句,在业务(Service)把查询的两个结果进行关联. (2)使用Auto Mapping特性,在实现两表联合查询时通过别名完 ...

  5. mybatis学习 十 动态 SQL

    1.  根据方法传入的参数不同执行不同的 SQL 命令.称为动态 SQL, MyBatis 中动态 SQL 就是在 mapper.xml 中添加逻辑判断等. 2. <if>标签 <s ...

  6. mybatis学习 十六 auto_mapping实现连表查询

    只能使用多表联合查询方式. 要求:查询出的列别和属性名相同. 点字符  "."  在 SQL 是关键字符,两侧添加反单引号(Tab键上的一个字符) <select id=&q ...

  7. mybatis学习 十五 resultMap标签 一对多

    多次查询,非联合查询版本 <resultMap type="teacher" id="techMap"> <id column="i ...

  8. mybatis学习 十四 resultMap标签 一对一(联合查询)

    1.使用 resultMap 实现关联单个对象(联合查询方式) <resultMap type="Student" id="stuMap1"> &l ...

  9. Mybatis学习笔记导航

    Mybatis小白快速入门 简介 本人是一个Java学习者,最近才开始在博客园上分享自己的学习经验,同时帮助那些想要学习的uu们,相关学习视频在小破站的狂神说,狂神真的是我学习到现在觉得最GAN的老师 ...

随机推荐

  1. 2018.5.6 解决问题:oracle------ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务

    解决问题:ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 或者是重启电脑之后无法进入控制台企业管理器(OEM)图形化界面(重新添加注入监听器就行了 文件listener.org) ...

  2. python_98_面向对象_学校

    class School(object):#以后都加object(基类) def __init__(self, name, addr): self.name = name self.addr = ad ...

  3. MAC OSXU盘会挂载目录

    当U盘接到系统后,你可以在Terminal里输入df -lh.这时,硬盘的使用和分区情况会输出,你在Mounted on 这一列数据中可以找到你的U盘或新添加的硬盘的挂载路径.

  4. Python——序列封包与序列解包

    一.序列封包与序列解包 把多个值赋给一个变量时,Python会自动的把多个值封装成元组,称为序列封包. 把一个序列(列表.元组.字符串等)直接赋给多个变量,此时会把序列中的各个元素依次赋值给每个变量, ...

  5. 理解AttributeUsage类

    类定义: // 摘要: // 指定另一特性类的用法. 此类不能被继承. [Serializable] [AttributeUsage(AttributeTargets.Class, Inherited ...

  6. d3网址

    官网: http://d3js.com D3创始人 http://bost.ocks.org.mike 教程: http://www.dashingd3js.com/table-of-contents ...

  7. (66)zabbix导入/导出配置文件

    通过导入/导出zabbix配置文件,我们可以将自己写好的模板等配置在网络上分享,我们也可以导入网络上分享的配置文件 配置文件有两种格式,分为为xml与json,通过zabbix管理界面可以导出xml, ...

  8. k8s 基于NFS部署storageclass pv自动供给

    在k8s中部署有状态应用时,通常需要做数据持久化存储. 后端存储的方式有以下几种: 1.基于宿主机本地的存储方式: (重启pod时,若pod被调度到其他节点上,尽管原来节点上的数据不会丢失,但是其他节 ...

  9. pandas处理较大数据量级的方法 - chunk,hdf,pkl

    前情提要: 工作原因需要处理一批约30G左右的CSV数据,数据量级不需要hadoop的使用,同时由于办公的本本内存较低的缘故,需要解读取数据时内存不足的原因. 操作流程: 方法与方式:首先是读取数据, ...

  10. Manjaro 添加国内源和安装搜狗输入法

    Manjaro 系统虽然比 Ubuntu 用着稳定,但有些小地方没有 Ubuntu 人性化,比如默认安装完的系统貌似没有中国的,Ubuntu 估计是用的人多,所以安装完后会根据所在地给你配置更新的源. ...