Mybatis 缓存
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 缓存的更多相关文章
- mybatis缓存
mybatis缓存http://www.cnblogs.com/QQParadise/articles/5109633.htmlhttp://www.mamicode.com/info-detail- ...
- Mybatis缓存处理机制
一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...
- MyBatis缓存禁用失败
问题:MyBatis缓存无法禁用,同一个session的select查询结果一样,但是数据库其实已改变. 尝试达到想要的目的: 1.msgmapper.xml里的select标签加上 <sele ...
- MyBatis入门学习教程-MyBatis缓存
一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了 package me.gacl.test; 2 import me.gacl.domain.User; import ...
- MyBatis学习总结(七)——Mybatis缓存(转载)
孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的 ...
- MyBatis学习总结(七)——Mybatis缓存
一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...
- MyBatis学习总结(七)——Mybatis缓存
一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...
- MyBatis——Mybatis缓存
原文:http://www.cnblogs.com/xdp-gacl/p/4270403.html MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架 ...
- 【转】MyBatis学习总结(七)——Mybatis缓存
[转]MyBatis学习总结(七)——Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualC ...
- 使用MyBatis缓存
(1).为什么需要使用缓存:: MyBatis是一个持久层(数据库层)映射框架,在所有访问数据库的操作中,无疑数据查询是最耗费数据库资源的操作了,因为你一次可能需要查询成千上百万条记录(如果你不加限制 ...
随机推荐
- 黑马程序员_Java基础:多线程总结
------- android培训.java培训.期待与您交流! ---------- 一.多线程的概念 进程和线程经常会被人混淆,那是因为对它们的概念不明确.就拿我们平时使用的操作系统来说,它是多任 ...
- python基础整理笔记(六)
一. 关于hashlib模块的一些注意点 hashlib模块用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512, MD ...
- JS动态级联菜单
JS动态级联菜单是前端常用的一个功能,特此抽时间研究了下,附上代码 <html> <head> <meta charset="utf-8" /> ...
- window.showModalDialog返回值和window.open返回值实例详解
最近在谷歌浏览器下发现一个问题,就是使用谷歌浏览器已经不兼容window.showModalDialog了,所以还是改成使用window.open(). 一.window.showModalDialo ...
- 简单BigDecimal运算精度
项目中遇到了数值运算,如网上所写的,一般有这几个方法: /** * 提供精确的加法运算. * @param v1 被加数 * @param v2 加数 * @return 两个参数的和 */ publ ...
- MYSQL中 ENUM 类型
MYSQL中 ENUM 类型的详细解释 ENUM类型 ENUM 是一个字符串对象,其值通常选自一个允许值列表中,该列表在表创建时的列规格说明中被明确地列举. 在下列某些情况下,值也可以是空串(&quo ...
- mono for android 各版本下载地址
window下 在XamarinStudio 检查更新,会在这个目录下生成LOG和下载文件,所以可以从里面复制出来,查看真实下载地址 C:\Users\用户名\AppData\Local\Xamari ...
- xxxx年度员工岗位技能调查表
昨天应公司要求设计了一张 <员工岗位技能调查表>,写微博有2个目的:第一是供大家参考,第二是记录下从事质量管理工作走过的点点滴滴.这是我第一次写工作方面的博客,之后会坚持写下去的. --- ...
- 你好,欢迎来到我的博客,我是博主royalmice1
你好,欢迎来到我的博客,我是博主royalmice
- libmegjb.so加载问题调试和分析
欢迎转载opendevkit文章, 文章原始地址: http://www.opendevkit.com/?e=70 01-01 00:09:21.084: D/dalvikvm(10394): Try ...