MyBatis同大多数ORM框架一样,提供了一级缓存和二级缓存的支持。

一级缓存:其作用域为session范围内,当session执行flush或close方法后,一级缓存会被清空。

二级缓存:二级缓存和一级缓存机制相同,但是可以自定义其作用范围,如Ehcache。

一级缓存

在默认情况下mybatis中的一级缓存是开启的,一级缓存只在同一个SqlSession中有效不可以跨SqlSession。

@Test
public void testcache(){
/**
* 测试一级缓存
*/
SqlSession session1 = sqlSessionFactory.openSession();
EmployeeMapper employeeMapper = session1.getMapper(EmployeeMapper.class);
List<Employee> list1 = employeeMapper.findAll(null);
System.out.println(list1);
List<Employee> list2 = employeeMapper.findAll(null);//不发送语句
System.out.println(list2);
}

SqlSession调用clearCache()清除缓存,或者在执行增删改操作后,SqlSession调用close(),commit()都会清理缓存。

二级缓存

MyBatis中使用二级缓存也非常简单,首先开启全局二级缓存配置信息,通过开启cacheEnabled,然后在对应的mapper映射文件中使用<cache />标签开启二级缓存即可。

1.select 语句获取出来的对象都会被缓存。

2.二级缓存所有实体类必须实现Serializable接口。

3.所有执行 insert,update 和 delete 语句后,缓存都会被刷新。
4.必须关闭session后才会写入二级缓存中。

5.二级缓存的作用域是全局的,作用范围是映射文件级别的。只在同一类型mapper映射对象中有效。

6.查询数据时,会先查询二级缓存,再查询一级缓存,然后再查询数据库。

我们需要使用二级缓存必须在mybatis主配置文件中设置cacheEnabled设置为true,并且在实体类Mapper中启用缓存。

<settings>
<!-- 开启驼峰式命名规则 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>

EmployeeMapper.xml

<!-- 使用mybatis默认二级缓存 -->
<cache/>

这样就可以开启我们的二级缓存了,但是这使用至少mybatis默认的二级缓存,mybatis缓存做的并怎么的好,所有我们需要整合第三方缓存机制。

EhCache 是一个纯Java的进程内缓存框架,是一种广泛使用的开源Java分布式缓存,具有快速、精干等特点,是Hibernate中默认的二级缓存。所以我们来整合Ehcache

导入:mybatis-ehcache-1.0.3.jar ,ehcache-core-2.6.8.jar,slf4j-api-1.7.25.jar ,slf4j-log4j12-1.7.25.jar

这个时候我们只需要在实体类指定只用EhCache缓存即可

<!-- 使用第三方缓存 -->
<cache type="org.mybatis.caches.ehcache.EhcacheCache" />

我们可以创建ehcache.xml配置文件也可以直接配置

<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
<property name="timeToIdleSeconds" value="3600"/><!--1 hour-->
<property name="timeToLiveSeconds" value="3600"/><!--1 hour-->
<property name="maxEntriesLocalHeap" value="1000"/>
<property name="maxEntriesLocalDisk" value="10000000"/>
<property name="memoryStoreEvictionPolicy" value="LRU"/>
</cache>

二级缓存属性

<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>

和缓存相关的设置

1.核心配置文件中的cacheEnabled=true|false,开启或关闭缓存(默认为true),只对二级缓存有效,对一级缓存无效。
2.在select标签中有一个属性useCache=true|false,开启当前查询标签的缓存(默认为true),也是只对二级缓存有效,对一级缓存无效。
3.在每个增删改标签中都有一个flushCache=true|false属性,设置是否清除缓存(默认为true)。一级和二级缓存都会被清空。
4.在查询中也有flushCache=true|false 属性(默认为false),如果设置为true,则每次查询之后都会清除缓存。

5.sqlsession.clearCache()方法,清除缓存。只能清除一级缓存,对二级缓存无效。
6.全局配置文件中的localCacheScope属性,表示本地缓存作用域(一级缓存)。取值为session|statement。默认为session。如果设置为statement,一级缓存会被禁用掉。

Mybait缓存机制的更多相关文章

  1. 【腾讯Bugly干货分享】彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/qOMO0LIdA47j3RjhbCWUEQ 作者:李 ...

  2. MyCat源码分析系列之——BufferPool与缓存机制

    更多MyCat源码分析,请戳MyCat源码分析系列 BufferPool MyCat的缓冲区采用的是java.nio.ByteBuffer,由BufferPool类统一管理,相关的设置在SystemC ...

  3. Java三大框架之——Hibernate中的三种数据持久状态和缓存机制

    Hibernate中的三种状态   瞬时状态:刚创建的对象还没有被Session持久化.缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID. 持久状态:对象经过 ...

  4. Spring缓存机制的理解

    在spring缓存机制中,包括了两个方面的缓存操作:1.缓存某个方法返回的结果:2.在某个方法执行前或后清空缓存. 下面写两个类来模拟Spring的缓存机制: package com.sin90lzc ...

  5. hibernate缓存机制(转)

    原文出处:http://www.cnblogs.com/wean/archive/2012/05/16/2502724.html 一.why(为什么要用Hibernate缓存?) Hibernate是 ...

  6. [转]Android ListView 与 RecyclerView 对比浅析—缓存机制

    从源码角度剖析ListView 与 RecyclerView 缓存机制的不同 https://zhuanlan.zhihu.com/p/23339185 原文地址:http://dev.qq.com/ ...

  7. HTML5应用缓存机制

    首先先上一张图: 用360浏览器的用户对这张图应该都是耳熟能详了吧,没错,当网络不通畅时使用360浏览器,便会有这张图弹出来.为什么没有网络还能弹出这一副画面呢?这就关乎HTML5的应用缓存机制了. ...

  8. 从零开始,搭建博客系统MVC5+EF6搭建框架(3),添加Nlog日志、缓存机制(MemoryCache、RedisCache)、创建控制器父类BaseController

    一.回顾系统进度以及本章概要 目前博客系统已经数据库创建.以及依赖注入Autofac集成,接下来就是日志和缓存集成,这里日志用的是Nlog,其实还有其他的日志框架如log4,这些博客园都有很多介绍,这 ...

  9. C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现之方法二:加入缓存机制

    在上一篇文章中我用递归方法实现了管理菜单,在上一节我也提到要考虑用缓存,也算是学习一下.Net Core的缓存机制. 关于.Net Core的缓存,官方有三种实现: 1.In Memory Cachi ...

随机推荐

  1. 近几年ACM/ICPC区域赛铜牌题

    2013 changsha zoj 3726 3728 3736 3735 2013 chengdu hud 4786 4788 4790 2013 hangzhou hdu 4770 4771 47 ...

  2. win7, ubuntu双系统,重装win7后,修复引导

    参考: http://blog.csdn.net/abcsunl/article/details/72875983 http://blog.csdn.net/davied9/article/detai ...

  3. CDH5.12安装检查Inspector failed on the following hosts...

    1 安装检查报错 2 原因是因为自己的文件没有全部同步过去 hadoop003文件下面缺少了cm文件夹的内容 3 cp过去 scp -r cm root@hadoop003:/var/www/html ...

  4. Css - 利于搜索引擎收录的三个标签

    Css - 利于搜索引擎收录的三个标签 <head> <meta charset="utf-8" /> <title>京东(JD.COM)-正品 ...

  5. XAF 框架中,自定义参数动作(Action),输入参数的控件可定义,用于选择组织及项目

    XAF 框架中,如何生成一个自定义参数动作(Action),输入参数的控件可定义? 参考文档:https://documentation.devexpress.com/eXpressAppFramew ...

  6. requests库入门13-会话对象

    会话对象可以在跨请求保持某些参数,会话对象有requests api的大部分方法,我理解会话对象就是一个资源共享池 使用requests.Session()可以创建会话对象的实例 还是以之前GitHu ...

  7. 正则表达式处理BT的html嵌套问题

    在博问里面求教大神,把问题搞定.在此做个记录备份,也给碰到类似问题的园友提供解决思路. 简化的业务场景就是,在页面html标签中的属性中嵌套了html标签,怎么用用正则表达式过滤闭合的html标签(& ...

  8. $Django 前后端之 跨域问题(同源策略) vue项目(axios跨域请求数据)

    1 跨域问题(多个域之间的数据访问) #同源策略(ip port 协议全部相同) #本站的只能请求本站域名的数据 #CORS实现(跨域资源共享) #实现CORS通信的关键是服务器.只要服务器实现了CO ...

  9. python操作三大主流数据库(12)python操作redis的api框架redis-py简单使用

    python操作三大主流数据库(12)python操作redis的api框架redis-py简单使用 redispy安装安装及简单使用:https://github.com/andymccurdy/r ...

  10. sugarCrm翻译

    Logic Hook hook配置信息和触发器定义在以下目录中 ./custom/Extension/modules/<module>/Ext/LogicHooks/<file> ...