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,一级缓存会被禁用掉。

转载于:https://www.cnblogs.com/SimpleWu/p/9783191.html

Mybait缓存机制相关推荐

  1. Django缓存机制

    Django缓存机制三个粒度:1 全站缓存 settings.py 全局配置文件用中间件:MIDDLEWARE = [# 'django.middleware.cache.UpdateCacheMid ...

  2. MyBatis复习笔记6:MyBatis缓存机制

    MyBatis缓存机制 MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制.缓存可以极大的提升查询效率. MyBatis系统中默认定义了两级缓存. 一级缓存和二级缓存. 默认情 ...

  3. java设置缓存机制

    2019独角兽企业重金招聘Python工程师标准>>> java设置缓存机制 所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实 ...

  4. LeetCode实战:LRU缓存机制

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Design and ...

  5. 微服务架构下静态数据通用缓存机制

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 |  my.oschina.net/u/3971241/bl ...

  6. 微服务架构下的静态数据通用缓存机制!

    什么是静态数据 为什么需要缓存 通用缓存机制 总结 后记 在分布式系统中,特别是最近很火的微服务架构下,有没有或者能不能总结出一个业务静态数据的通用缓存处理机制或方案,这篇文章将结合一些实际的研发经验 ...

  7. 深入浅出 MyBatis 的一级、二级缓存机制

    一.MyBatis 缓存 缓存就是内存中的数据,常常来自对数据库查询结果的保存.使用缓存,我们可以避免频繁与数据库进行交互,从而提高响应速度. MyBatis 也提供了对缓存的支持,分为一级缓存和二级 ...

  8. ecshop的缓存机制更改

    ecshop是一个不错的平台,其中有一些地方可以改进一下 总体上看,就是一个大sql,global变量传来传去的,所有的只要取数据的时候,执行一个sql语句就可以了,但是一些需要缓存的地方,它使用的是 ...

  9. Hibernate 缓存机制

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

最新文章

  1. 国内卫星通信技术发展及应用概述
  2. input ios问题
  3. Recurrent Neural Network[Quasi RNN]
  4. TensorFlow:实战Google深度学习框架(一)计算、数据、运行模型
  5. CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构区别...
  6. 发微博/文章设计思路
  7. 腾讯又“撒钱”了!奖励2.28万员工800万股,人均16.6万港元 网友:福利界天花板...
  8. iframe弹出层中关闭包含iframe的div(子页面调用父页面js函数)
  9. 人脸检测(十二)--DDFD算法
  10. DevExpress XtraReports 入门五 创建交叉表报表
  11. python3编码得到中文_Python3的unicode编码转换成中文的问题及解决方案
  12. 计算机网络管理一07872自考知识点,电子信息工程专业2019年10月四川自考科目及考试时间[本科]...
  13. 交换技术三种重要的交换
  14. 使用Map集合来做一个不同姓氏人数的统计 有一个String数组保存着10个人的姓名{“张三“,“李四“,“王二“...} 通过程序设计,把不同姓氏的姓氏和人数保存到Map集合中
  15. 仿照中国银行页面进行编写,主要涉及到float,定位
  16. 【uni-app】解决iPhone X “刘海屏”兼容性问题
  17. 多个视频的音频互换软件,一键互换视频的音频声音
  18. sublime Text 3 javaScript代码自动提示插件安装步骤
  19. VASP安装教程-虚拟机-2022
  20. Associations - 关联

热门文章

  1. WMI技术介绍和应用——查询时间信息
  2. 票据自动处理系统著名研究团队
  3. 【经验】Lenovo/ThinkPad 进入BIOS的方法汇总
  4. 什么时候是创业最佳时机?7个最佳的励志创业时机GET了吗
  5. json vue 对象转数组_vue 基础入门(一)修改
  6. c语言顺序表有效元素长度,用C语言描述的顺序表类型
  7. 关于python缩进的描述中_关于Python程序中与“缩进”有关的说法中,以下选项中正确的是()...
  8. python 非_Python函数的非固定参数
  9. Mybatis注解学习记录
  10. 多线程2(常用的方法:join、interrupt、currentThread、isAlive、setDaemon...)