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. Redis 入门练习

    Redis提供了一个命令行入门练习的web:http://try.redis.io/ ///////////////////////////////////////////////////////// ...

  2. 非对称加密RSA的应用及在C#中的实现

    quote: http://www.cnblogs.com/happinessCodes/archive/2010/07/27/1786404.html   一说到数据的加密,常常会涉及到这几个单词: ...

  3. 8.2 辅助 xUtils 3.0

    主要有四大模块: DbUtils模块: android中的orm(对象关系映射)框架,一行代码就可以进行增删改查: 支持事务,默认关闭: 可通过注解自定义表名,列名,外键,唯一性约束,NOT NULL ...

  4. SQL中的共享锁分析及如何解锁

    1.1.1 摘要 在系统设计过程中,系统的稳定性.响应速度和读写速度至关重要,就像12306.cn那样,当然我们可以通过提高系统并发能力来提高系统性能总体性能,但在并发作用下也会出现一些问题,例如死锁 ...

  5. C#线程同步的几种方法

    一.volatile关键字 volatile是最简单的一种同步方法,当然简单是要付出代价的.它只能在变量一级做同步,volatile的含义就是告诉处理器, 不要将我放入工作内存, 请直接在主存操作我. ...

  6. ajax 跨域请求时url参数添加callback=?会实现跨域问题

    例如: 1.在 jQuery 中,可以通过使用JSONP 形式的回调函数来加载其他网域的JSON数据,如 "myurl?callback=?".jQuery 将自动替换 ? 为正确 ...

  7. SQLSERVER2008新增的审核/审计功能

    SQLSERVER2008新增的审核/审计功能 很多时候我们都需要对数据库或者数据库服务器实例进行审核/审计 例如对失败的登录次数进行审计,某个数据库上的DDL语句进行审计,某个数据库表里面的dele ...

  8. Android横竖屏切换

    ps:虽然现在的app一般都是固定一个屏幕方向,但是还是有必要了解下屏幕切换的方法和注意. 一 固定横竖屏 androidmainfest.xml中设置activoty属性:android:scree ...

  9. ACEXML解析XML文件——简单示例程序

    掌握了ACMXML库解析XML文件的方法后,下面来实现一个比较完整的程序. 定义基本结构 xml文件格式如下 <?xml version="1.0"?> <roo ...

  10. java提高篇(三十)-----Iterator

    迭代对于我们搞Java的来说绝对不陌生.我们常常使用JDK提供的迭代接口进行Java集合的迭代. Iterator iterator = list.iterator(); while(iterator ...