Mybatis的缓存
- Mybatis缓存概述及其意义
-
- 一级缓存
-
- 二级缓存
-
- sqlSession没有关闭或提交,二级缓存没数据-测试
- cache 标签属性配置(二级缓存配置)
- 查询步骤
- mybatis 和 ehcache 缓存框架整合
Mybatis缓存概述及其意义
缓存对应的英文单词:cache
mybatis缓存:
将select 语句的查询结果放到缓存(内存)当中,下一次还是这条select 语句的话,直接从缓存中取,不再查数据库,一方面是减少IO,另一方面不再执行繁琐的查找算法,效率大大提升。
mybatis 缓存包括:
- 一级缓存:将查询的数据存储到
SqlSession
对象中。
- 二级缓存:将查询的数据存储到
SqlSessionFactory
对象中。
- 或者集成其他第三方的缓存:比如 EhCache【Java语言开发的】、Memcache【C语言开发的】等。
注意:缓存只针对DQL
语句,也就是说缓存机制只对应select
语句。
Mybatis 缓存的意义
- 将用户经常查询的数据存放在缓存中(内存)中,用户去查询就不用去磁盘中去查询了,从缓存去查询,从而提高查询效率,解决了高并发系统的性能问题;
- 通过减少IO使用的方式,来提高程序的执行效率。
一级缓存
一级缓存默认情况下是开启的,不需要做任何配置。
原理:只要使用同一SqlSession对象执行同一条SQL语句,就会走缓存。
可以看见两次同一个SqlSession对象执行的同一条DQL语句只执行了一次查询。
什么时候不走缓存?
- SqlSession 对象不是同一个;
- 查询参数或者查询条件不一样。
什么时候一级缓存失效?
在两次DQL之间做了以下事情就会使得一次缓存清空:
- 执行了
SqlSession
的clearCache()
方法,这是手动清空缓存。
- 执行了
DML
语句,不管是操作哪张表,都会自动情况缓存。
测试一:
测试二、
二级缓存
二级缓存的范围是SqlSessionFactory。
使用二级缓存需要具备下列几个条件:
< setting name="cacheEnabled" value="true" />
全局性地开启或关闭所有映射器配置文件中已配置的任何缓存,默认就是true,无需设置。
- 在需要使用二级缓存的SqlMapper.xml 文件中添加配置:< cache />。
- 使用二级缓存的实体类对象必须是可序列化的,也就是必须实现
java.io.Serializable
接口。
- SqlSession 对象关闭或提交之后,一级缓存中的数据才会被写入到二级缓存当中,此时二级缓存才可用。
sqlSession没有关闭或提交,二级缓存没数据-测试
修改后二级缓存中有数据:
cache 标签属性配置(二级缓存配置)
- eviction:指定从缓存中移除某个对象的淘汰算法,默认采用LRU策略。
- flushInterval:二级缓存的刷新时间间隔。单位毫秒,如果没有设置,就代表不刷新缓存,只要内存足够大,一直会向二级缓存中缓存数据,除非执行了DML语句。
- readOnly:
- true:多条相同的sql语句执行之后返回的对象是共享的同一个(内存地址一致),性能好。但是多线程并发可能会存在安全问题。
- false:多条相同的sql语句执行之后返回的是对象是副本,调用了clone方法,性能一般,但安全。
- size:设置二级缓存中最多可存储的java对象数量,默认值1024.
查询步骤
每次查询先看二级缓存有没有打开,如果打开了则在二级缓存中查找数据,如果没找到则查看一级缓存有没有打开,如果打开了则在一级缓存中查找数据,如果没找到则从数据库中查询。
mybatis 和 ehcache 缓存框架整合
集成 EhCache 框架是为了代替mybatis 中自带的二级缓存,一级缓存是无法代替的。
mybatis 对外提供了接口,是可以集成第三方缓存组件的。
具体操作看这篇博客:mybatis整合ehcache