MyBatis之二级缓存

二级缓存与一级缓存区别:二级缓存的范围更大,多个sqlSession可以共享一个UserMapper的二级缓存区域。

每一个mapper都有一个自己的二缓存区域(按namespace区分),两个mapper的namespace如果相同,这两个mapper执行sql查询到数据将存在相同 的二级缓存区域中。

二级缓存原理:

开启二级缓存

1. 只需要在你的Mapper映射文件中添加一行:  
<cache />

2.调用pojo类实现序列化接口

若没有指定cache标签的属性值,将采用默认的行为进行缓存,即:

    • 映射文件中所有的select语句将被缓存
    • 映射文件中所有的insert、update和delete语句将刷新缓存
    • 缓存将使用LRU(Least Recently Used)最近最少使用策略算法来回收
    • 刷新间隔(no Flush Interval,没有刷新间隔),缓存不会以任何时间顺序来刷新
    • 缓存会存储列表集合和对象(无论查询方法返回什么)的1024个引用
    • 缓存会被视为read/write(可读/可写)的缓存,意味着对象检索不是共享的,而且可以安全的被调用者修改,而不干扰其他调用者或者线程所做的潜在修改

cache标签的属性详解:

题外话: 如果让我设计出一个缓存机制,我会从内部和外部分别考虑,内部:缓存容量,缓存更新机制(包含:回收策略 + 更新时间), 外部:是可读写,还是只读的; 因此,就不难理解,下面的属性设定了;

eviction(指定可用的回收策略):

  • 【默认】LRU——最近最少使用的:移除最长时间不被使用的对象
  • FIFO——先进先出的:按对象进入缓存的顺序来移除他们
  • SOFT——软引用:移除基于垃圾回收器状态和软引用规则的对象
  • WEAK——弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。

flushInterval(刷新间隔)取值为任意的正整数,表示一时间段(注:60*60*1000这种形式是不允许的)。不设置默认情况是没有刷新间隔,即:缓存仅仅调用语句时刷新。 
size(引用数目)取值为任意正整数,引用数目=缓存的对象数目+运行环境的可用内存资源数目。默认值是1024. 
readOnly(只读)取值为true或false。只读的缓存会给所有调用者返回缓存对象的相同实例,因此这些对象不能被修改,有性能优势。可读写的缓存会返回缓存对象的拷贝(通过序列化)。有安全优势;默认是false。

例如:

<cache 
 eviction="FIFO"  
 flushInterval="10800000"  size="512" 
 readOnly="true"

/>

解读:这个更高级的配置创建了一个FIFO缓存,并每隔3个小时刷新缓存,储存结
果对象或列表的512个引用,而且返回的对象被认为是只读的,因此在不同线程中的调用者之间修改他们会导致冲突。

配置完<cache/>表示该mapper映射文件中,所有的select语句都将被缓存,所有的insert、update和delete语句都将刷新缓存。

若希望有些select不想被缓存时,可以添加select的属性useCache=“false”;即:禁用当前select语句的二级缓存,即每次查询都会发出sql去查询;

若希望有些insert、update和delete不想让它刷新缓存时,添加属性flushCache=”false”。即:不执行刷新缓存;注意:注意如果会出现脏读,例如:使用缓存时如果手动修改数据库表中的查询数据会出现脏读。

参考出处:

http://blog.csdn.net/acmman/article/details/46793289

http://www.cnblogs.com/OnlyCT/p/4792027.html

时间: 2024-10-29 19:08:17

MyBatis之二级缓存的相关文章

使用redis作为mybatis的二级缓存

本次介绍一下使用mybatis-redis项目作为mybatis的二级缓存在生产项目中的配置与应用. 首先,在pom中添加一下依赖: <!-- mybatis cache --> <dependency>     <groupId>org.mybatis.caches</groupId>     <artifactId>mybatis-redis</artifactId>     <version>1.0.0-beta2&

Mybatis的二级缓存注意点

--声明:一下内容都不一定是正确的,只是自己测试的结果,请自己的动手操作得出自己的结论 1.开启Mybatis的二级缓存,不仅要在SqlMapConfig.xml中进行开启总开关,还要在对应的XXXMapper.xml中开启,缺少其中一个二级缓存都不能开启(起不到二级缓存的作用): 2.开启Mybatis的二级缓存后,一级缓存同样起作用(相同的SqlSession一级缓存,不同的SqlSession二级缓存) 3.一级缓存,只要执行了增删改,不管有没有提交,都会清空缓存,后面如果还有相同sql的

使用Redis做MyBatis的二级缓存

1. 介绍 使用mybatis时可以使用二级缓存提高查询速度,进而改善用户体验. 使用redis做mybatis的二级缓存可是内存可控<如将单独的服务器部署出来用于二级缓存>,管理方便. 2. 使用思路 2.1 配置redis.xml 设置redis服务连接各参数 2.1 在配置文件中使用 <setting> 标签,设置开启二级缓存: 2.2 在mapper.xml 中使用<cache type="com.demo.RedisCacheClass" /&g

MyBatis的二级缓存的设计原理

MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能.本文将全面分析MyBatis的二级缓存的设计原理. 1.MyBatis的缓存机制整体设计以及二级缓存的工作模式 如上图所示,当开一个会话时,一个 SqlSession对象会使用一个 Executor对象来完成会话操作, MyBatis的二级缓存机制的关键就是对这个 Executor对象做文章.如果用户配置了" cacheEnabled=true",那么 MyBatis在为 Sql

《深入理解mybatis原理》 MyBatis的二级缓存的设计原理

MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能.本文将全面分析MyBatis的二级缓存的设计原理. 1.MyBatis的缓存机制整体设计以及二级缓存的工作模式 如上图所示,当开一个会话时,一个SqlSession对象会使用一个Executor对象来完成会话操作,MyBatis的二级缓存机制的关键就是对这个Executor对象做文章.如果用户配置了"cacheEnabled=true",那么MyBatis在为SqlSession

mybatis开启二级缓存小记

mybatis开启二级缓存小记 1.开启二级缓存 和一级缓存默认开启不一样,二级缓存需要我们手动开启 首先在全局配置文件 mybatis-configuration.xml 文件中加入如下代码: <!--开启二级缓存 --> <settings> <setting name="cacheEnabled" value="true"/> </settings> 其次在 UserMapper.xml 文件中开启缓存 <

《深入理解mybatis原理7》 MyBatis的二级缓存的设计原理

<深入理解mybatis原理> MyBatis的二级缓存的设计原理 MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能.本文将全面分析MyBatis的二级缓存的设计原理. 1.MyBatis的缓存机制整体设计以及二级缓存的工作模式 如上图所示,当开一个会话时,一个SqlSession对象会使用一个Executor对象来完成会话操作,MyBatis的二级缓存机制的关键就是对这个Executor对象做文章.如果用户配置了"cache

SSM-MyBatis-17:Mybatis中二级缓存

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 二级缓存 Mybatis中,默认二级缓存是开启的.可以关闭. 一级缓存开启的.可以被卸载吗?不可以的.一级缓存不可以卸载,天然和框架绑定.内置二级缓存 由于MyBatis从缓存中读取数据的依据与SQL的id相关,而非查询出的对象.所以,使用二级缓存的目的,不是在多个查询间共享查询结果(所有查询中只要查询结果中存在该对象, 就直接从缓存中读取,这是对查询结果的共享,Hibernate中的缓存就是为了在多个查询

MyBatis的二级缓存

目录 Mybatis中如何配置二级缓存 Cache解析处理过程 Cache支持的过期策略 装饰器源码 Mybatis中如何配置二级缓存 基于注解配置缓存 @CacheNamespace(blocking=true) public interface PersonMapper { @Select("select id, firstname, lastname from person") public List<Person> findAll(); } 基于XML配置缓存 &l

MyBatis 学习记录5 MyBatis的二级缓存

主题 之前学习了一下MyBatis的一级缓存,主要涉及到BaseExecutor这个类. 现在准备学习记录下MyBatis二级缓存. 配置二级缓存与初始化发生的事情 首先二级缓存默认是不开启的,需要自己配置开启. 如上图,需要在configuration里去开启. 其次在需要用到二级缓存的Mapper的配置里做一些操作,如下图,增加一个cache节点 至此就可以在UserMapper上开启二级缓存了. 当MaBatis初始化的时候,需要解析各种XML配置来生成SQLSessionFactory,