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

最新文章

  1. nginx+lua
  2. C# v3微信 access token 过期处理的问题
  3. Java程序员的日常 —— 注册工厂的妙用
  4. script和href
  5. Lab1--关于安装JUnit的简要描述
  6. Java插件开发-取插件下的某个文件
  7. OC语言-01-面向过程与面向对象思想
  8. js九九乘法表
  9. TV端产品设计法则和分析
  10. tab选项卡
  11. C#几种截取字符串的方法小结 (摘抄)
  12. 【卷一】正则四 |&gt; 练习
  13. ssh免密码记录
  14. ajax事件请求
  15. 自制 Python小工具 将markdown文件转换成Html文件
  16. netsh自动配置网络
  17. IT术语
  18. win7右键菜单调整顺序
  19. Canvas 实现图片合成并下载合成图片
  20. 关于Cocos2d-x中数据的存储提取和类型转换

热门文章

  1. Kaldi的BaseLine训练过程
  2. centos7 安装.net core的方法
  3. 添加 node mocha 测试模块
  4. Linux中find命令的用法汇总
  5. super和this的区别
  6. linux系统 之 curl命令
  7. 线程变量---ThreadLocal类
  8. Zookeeper学习笔记3
  9. Python学习笔记-数字类型
  10. 2017-2018-2 20165231 实验四 Android程序设计