1. 一级缓存:其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空。

2. 二级缓存与一级缓存其机制相同,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如第三方 Ehcache。

一、一级缓存

实体类city

public class City implements Serializable{
private static final long serialVersionUID = 1L;
private int id;
private String cityName;
private String provinceId;
//getters、setters
}

CityMapper

<mapper namespace="com.area.dao.CityDao">
<select id="findByProvinceId" resultType="city">
select * from city where provinceId = #{pId}
</select>
</mapper>

测试;

@Test
public void testById() {
sqlSession = sqlSessionFactory.openSession();
CityDao cityDao = sqlSession.getMapper(CityDao.class);
cityDao.findByProvinceId("p1");
cityDao.findByProvinceId("p1");
sqlSession.commit();
}

测试结果

[com.area.dao.CityDao.findByProvinceId] - ==>  Preparing: select * from city where provinceId = ?
[com.area.dao.CityDao.findByProvinceId] - ==> Parameters: p1(String)
[com.area.dao.CityDao.findByProvinceId] - <== Total: 1

从sql中可以看出,只有一次查询数据库的过程,这种现象产生的原因就是mybatis的一级缓存,并且一级缓存是默认开启的

二、二级缓存

未开启二级缓存

@Test
public void test() {
sqlSession = sqlSessionFactory.openSession();
CityDao cityDao = sqlSession.getMapper(CityDao.class);
cityDao.findByProvinceId("p1");
sqlSession.commit();
sqlSession1 = sqlSessionFactory.openSession();
CityDao cityDao1 = sqlSession1.getMapper(CityDao.class);
cityDao1.findByProvinceId("p1");
sqlSession.commit();
}
2016-11-09 11:45:00 - ==>  Preparing: select * from city where provinceId = ?
2016-11-09 11:45:00 - ==> Parameters: p1(String)
2016-11-09 11:45:00 - <== Total: 1
2016-11-09 11:45:00 - JDBC Connection
2016-11-09 11:45:00 - ==> Preparing: select * from city where provinceId = ?
2016-11-09 11:45:00 - ==> Parameters: p1(String)
2016-11-09 11:45:00 - <== Total: 1
2016-11-09 11:45:00 - Returning JDBC Connection to DataSource

两个session,分别查询provinceid为p1的city,与数据库交互了两次,这样说明mybatis当前并没有开启二级缓存。

配置如下:

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

 

<mapper namespace="com.area.dao.CityDao">
<select id="findByProvinceId" resultType="city">
select * from city where provinceId = #{pId}
</select>
<cache/>
</mapper>

测试结果 

2016-11-09 11:41:11 - ==>  Preparing: select * from city where provinceId = ?
2016-11-09 11:41:11 - ==> Parameters: p1(String)
2016-11-09 11:41:12 - <== Total: 1
2016-11-09 11:41:12 - Cache Hit Ratio [com.area.dao.CityDao]: 0.5
2016-11-09 11:41:12 - Returning JDBC Connection to DataSource

只发出一条sql,第二条显示命中缓存,说明二级缓存起到缓存作用 

总结:

mybatis

一级缓存:默认开启

二级缓存:

1. 映射语句文件中的所有select语句将会被缓存。

2. 映射语句文件中的所有insert,update和delete语句会刷新缓存。

3. 缓存会使用Least Recently Used(LRU,最近最少使用的)算法来收回。

4. 缓存会根据指定的时间间隔来刷新。

5. 缓存会存储1024个对象

Mybatis 缓存的更多相关文章

  1. mybatis缓存

    mybatis缓存http://www.cnblogs.com/QQParadise/articles/5109633.htmlhttp://www.mamicode.com/info-detail- ...

  2. Mybatis缓存处理机制

    一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...

  3. MyBatis缓存禁用失败

    问题:MyBatis缓存无法禁用,同一个session的select查询结果一样,但是数据库其实已改变. 尝试达到想要的目的: 1.msgmapper.xml里的select标签加上 <sele ...

  4. MyBatis入门学习教程-MyBatis缓存

    一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了 package me.gacl.test; 2 import me.gacl.domain.User; import ...

  5. MyBatis学习总结(七)——Mybatis缓存(转载)

      孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的 ...

  6. MyBatis学习总结(七)——Mybatis缓存

    一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...

  7. MyBatis学习总结(七)——Mybatis缓存

    一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...

  8. MyBatis——Mybatis缓存

    原文:http://www.cnblogs.com/xdp-gacl/p/4270403.html MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架 ...

  9. 【转】MyBatis学习总结(七)——Mybatis缓存

    [转]MyBatis学习总结(七)——Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualC ...

  10. 使用MyBatis缓存

    (1).为什么需要使用缓存:: MyBatis是一个持久层(数据库层)映射框架,在所有访问数据库的操作中,无疑数据查询是最耗费数据库资源的操作了,因为你一次可能需要查询成千上百万条记录(如果你不加限制 ...

随机推荐

  1. LINUX 虚拟机克隆与网络配置

    虚拟机克隆后,启动之后发现网卡没有启动.发现提示错误信息“Device eth0 does not seem to be present, delaying initialization.” 解决方法 ...

  2. BNUOJ 51279[组队活动 Large](cdq分治+FFT)

    传送门 大意:ACM校队一共有n名队员,从1到n标号,现在n名队员要组成若干支队伍,每支队伍至多有m名队员,求一共有多少种不同的组队方案.两个组队方案被视为不同的,当且仅当存在至少一名队员在两种方案中 ...

  3. 《《我是一只IT小小鸟》》读后感

    接触IT也已经半年了,在这半年我没有充足的时间去了解IT这个行业,在大学生职业规划课程上,老师推荐了<<我是一只IT小小鸟>>这本书,我才发现IT这个行业并不是想象的那么无趣, ...

  4. java面向对象(封装-继承-多态)

    框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...

  5. CCNA第二章TCP/IP简介考试要点学习笔记

    1.描述网络是如何工作的     DoD过程/应用层 -- OSI应用.表示和会话层(定义了结点到结点的应用通信协议以及对用户界面规范的控制): DoD主机到主机层 -- OSI传输层(保证了数据包的 ...

  6. 工作随笔——UIButton的EdgeInsets + Swift中的正则表达式;

    1.UIButton的EdgeInsets UIButton的EdgeInsets方法,是用来设置title和image对于上左下右四个方向的偏移,但是很奇怪的是,刚开始只有Image,titile也 ...

  7. HTML5 div+css导航菜单

    HTML5 div+css导航菜单 视频 音乐 小说   故事 作品 阅读 联系

  8. ABP框架详解(四)Feature

    ABP框架中存在一个Feature的特性,功能和设计思路非常类似于框架中的Authorization功能,都是来控制用户是否能够继续操作某项功能,不同点在于Authorization默认是应用在IAp ...

  9. Linux之脚本安装软件

      查看启动程序   ps aux    准备工作 1.保证yum源正常使用 2.关闭SELinux和防火墙   下载脚本文件包 解压缩 运行 ./centors.sh

  10. 解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase --MDF文件的瑞士军刀(译)

    解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase --MDF文件的瑞士军刀(译) http://improve.dk/orcamdf-rawdatabase-a-swiss-a ...