.1二级缓存
1.1.1原理
mybatis和spring整合后一级缓存就没有了,sqlSession在不关闭的前提下2次查询就会从缓存中取,一级缓存缓存在sqlSession对象里面,当多用户查询的时候就用到二级缓存了。UserMapper缓存:会把根据id和根据name查询的用户信息写进缓存,如果有人发了insert语句则会把所有的用户信息清空,二级缓存是命名空间级别的。

二级缓存的范围是mapper级别(mapper同一个命名空间的缓存,在UserMapper.xml里面有一个命名空间<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">,不同的xml文件中命名空间可以相同),mapper以命名空间为单位创建缓存数据结构,结构是map<key、value>。
每次查询先看是否开启二级缓存,如果开启从二级缓存的数据结构中取缓存数据,

如果从二级缓存没有取到,再从一级缓存中找,如果一级缓存也没有,从数据库查询。
1.1.1mybatis二级缓存配置
在核心配置文件SqlMapConfig.xml中加入
<setting name="cacheEnabled" value="true"/>

描述

允许值

默认值

cacheEnabled

对在此配置文件下的所有cache 进行全局性开/关设置。

true false

true

要在你的Mapper映射文件中添加一行:  <cache /> ,表示此mapper开启二级缓存。
1.1.1查询结果映射的pojo序列化
mybatis二级缓存需要将查询结果映射的pojo实现 java.io.serializable接口,如果不实现则抛出异常:
org.apache.ibatis.cache.CacheException: Error serializing object. Cause: java.io.NotSerializableException: cn.itcast.mybatis.po.User
因为二级缓存可以将内存的数据写到磁盘,存在对象的序列化和反序列化,所以要实现java.io.serializable接口。
如果结果映射的pojo中还包括了pojo,都要实现java.io.serializable接口。
1.1.1二级缓存禁用
对于变化频率较高的sql(比如支付宝银行账户余额),存到缓存没有意义因为一直在变化,需要禁用二级缓存:
在statement中设置useCache=false可以禁用当前select语句的二级缓存,即每次查询都会发出sql去查询,默认情况是true,即该sql使用二级缓存。
<select id="findOrderListResultMap" resultMap="ordersUserMap" useCache="false">
1.1.2刷新缓存
如果sqlsession操作commit操作,对二级缓存进行刷新(全局清空)。
设置statement的flushCache是否刷新缓存,默认值是true,默认建议刷新,如果不刷新就会读取脏数据。把select中的 useCache="false"去掉,在insert或update中<update id="updateUser" parameterType="cn.itcast.mybatis.po.User" flushCache="false">加上flushCache="false"
1.1.3测试代码
//二级缓存的测试
@Test
public void testCache2() throws Exception { SqlSession sqlSession1 = sqlSessionFactory.openSession();
SqlSession sqlSession2 = sqlSessionFactory.openSession();
SqlSession sqlSession3 = sqlSessionFactory.openSession();
UserMapper userMapper1 = sqlSession1.getMapper(UserMapper.class);
UserMapper userMapper2 = sqlSession2.getMapper(UserMapper.class);
UserMapper userMapper3 = sqlSession3.getMapper(UserMapper.class); //第一次查询用户id为1的用户,此时会写入缓存,如果设置刷新间隔为1秒,那么1秒以后缓存就清空了,下面的语句再查询的时候就会重新从数据库查询,
User user = userMapper1.findUserById();
System.out.println(user);
sqlSession1.close(); //中间修改用户要清空缓存,目的防止查询出脏数据
/*user.setUsername("测试用户2");
userMapper3.updateUser(user);
sqlSession3.commit();
sqlSession3.close();*/ //第二次查询用户id为1的用户
User user2 = userMapper2.findUserById();
System.out.println(user2); sqlSession2.close();
1.1.1mybatis的cache参数(了解)
mybatis的cache参数只适用于mybatis维护缓存。
flushInterval(刷新间隔,过了这个时间缓存就清空了)可以被设置为任意的正整数,而且它们代表一个合理的毫秒形式的时间段。默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。
size(引用数目,缓存对象的个数)可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的可用内存资源数目。默认值是1024。
readOnly(只读)属性可以被设置为true或false。只读的缓存会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是false。
eviction="FIFO" 表示缓存策略,比如到达时间后如何清空,清空的方案,
如下例子:
<cache  eviction="FIFO"  flushInterval=""  size=""  readOnly="true"/>
这个更高级的配置创建了一个 FIFO 缓存,并每隔  秒刷新,存数结果对象或列表的  个引用,而且返回的对象被认为是只读的,因此在不同线程中的调用者之间修改它们会导致冲突。可用的收回策略有, 默认的是 LRU:
.LRU – 最近最少使用的:移除最长时间不被使用的对象。
.FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
.SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
.WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。

mybatis0209 二级缓存的更多相关文章

  1. 探索ASP.NET MVC5系列之~~~5.缓存篇(页面缓存+二级缓存)

    其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...

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

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

  3. Hibernate+EhCache配置二级缓存

    步骤: 第一步:加入ehcache.jar 第二步: 在src目录下新建一个文件,名为:ehcache.xml 第三步:在hibernate配置文件的<session-factory>下配 ...

  4. MyBatis 延迟加载,一级缓存,二级缓存设置

    什么是延迟加载 resultMap中的association和collection标签具有延迟加载的功能. 延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息.使用关联信息时再去加载关联信息 ...

  5. EF 二级缓存 EFSecondLevelCache

    EFSecondLevelCache ======= Entity Framework .x Second Level Caching Library. 二级缓存是一个查询缓存.EF命令的结果将存储在 ...

  6. MVC实用架构设计(三)——EF-Code First(5):二级缓存

    前言 今天我们来谈谈EF的缓存问题. 缓存对于一个系统来说至关重要,但是是EF到版本6了仍然没有见到有支持查询结果缓存机制的迹象.EF4开始会把查询语句编译成存储过程缓存在Sql Server中,据说 ...

  7. hibernate笔记--缓存机制之 二级缓存(sessionFactory)和查询缓存

    二级缓存(sessionFactory): Hibernate的二级缓存由SessionFactory对象管理,是应用级别的缓存.它可以缓存整个应用的持久化对象,所以又称为“SessionFactor ...

  8. Hibernate ——二级缓存

    一.Hibernate 二级缓存 1.Hibernate 二级缓存是 SessionFactory 级别的缓存. 2.二级缓存分为两类: (1)Hibernate内置二级缓存 (2)外置缓存,可配置的 ...

  9. hibernate缓存(一级缓存、二级缓存)

    一.一级缓存(Session缓存)      意义:提高hibernate查询效率.      缺点:可能会因并发,产生数据不一致.      基于session的缓存,利用hibernate执行查询 ...

随机推荐

  1. [转]LINK:fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

    LINK:fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 原文地址:http://yacare.iteye.com/blog/2010049 很多伙伴在更新VS ...

  2. bzoj 2502 清理雪道(有源汇的上下界最小流)

    [题意] 有一个DAG,要求每条边必须经过一次,求最少经过次数. [思路] 有上下界的最小流.  边的下界为1,上界为无穷.构造可行流模型,先不加ts边跑一遍最大流,然后加上t->s的inf边跑 ...

  3. 区间DP+next求循环节 uva 6876

    // 区间DP+next求循环节 uva 6876 // 题意:化简字符串 并表示出来 // 思路:dp[i][j]表示 i到j的最小长度 // 分成两部分 再求一个循环节 #include < ...

  4. LeetCode 234 Palindrome Linked List

    Given a singly linked list, determine if it is a palindrome. 思路: 回文结构从后向前遍历与从前向后遍历的结果是相同的,可以利用一个栈的结构 ...

  5. 用Gitolite 构建 Git 服务器

    转载 Gitolite 构建 Git 服务器 作者: 北京群英汇信息技术有限公司 网址: http://www.ossxp.com/ 版本: 0.1-1 日期: 2010-10-07 14:52:19 ...

  6. av_interleaved_write_frame 网络不好的情况下返回较慢

    用libvlc做直播推流引擎在网络较差的情况下,需要关闭直播,并且重新开播.这个过程中,推流引擎重启,需要的是快速响应.实际上测试结果发现,经常会发生引擎关闭接口卡住.后来跟踪代码,定位到s_rtmp ...

  7. libpcap/wwinpcap

    winpcap(windows packet capture)是windows平台下一个免费,公共的网络访问系统.开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力.win ...

  8. homework-06-C++11

    http://blog.csdn.net/lancelet/article/details/7220558 http://www.csdn.net/article/2012-05-15/2805585 ...

  9. Web开发人员需知的Web缓存知识

    最近的译文距今已有4年之久,原文有一定的更新.今天踩着前辈们的肩膀,再次把这篇文章翻译整理下.一来让自己对web缓存的理解更深刻些,二来让大家注意力稍稍转移下,不要整天HTML5, 面试题啊叨啊叨的~ ...

  10. Beginning OpenGL ES 2.0 with GLKit Part 1

    Update 10/24/12: If you’d like a new version of this tutorial fully updated for iOS 6 and Xcode 4.5, ...