mybatis缓存
mybatis的缓存
意义: 提高数据库的性能.
分类: 一级缓存和二级缓存
结构图:
一级缓存是sqlSession级别的缓存: 在操作数据库时需要构造sqlSession对象,
在对象中有一个数据结构(HashMap)用于存储缓存数据, 不同的sqlSession之间的缓存数据区域(HashMap)是互不影响的.
原理图:
第一次发起查询id为1的用户信息, 先去缓存中是否有id为1的用户信息, 如果没有, 则去数据库中查询返回,
得到的用户信息保存到一级缓存中
如果sqlSession执行commit(比如插入, 更新, 删除), 将清空sqlSession中的一级缓存, 这样做的目的是
让缓存中存储的数据是数据库中最新的信息, 避免脏读.
第二次发起查询id为1的用户信息, 先去缓存中是否有id为1的用户信息, 缓存中有, 则直接从缓存中获取用户信息
mybatis默认支持一级缓存, 不需要再xml配置文件中开启缓存开关.
---------------------------------------------------------------------------------------------
二级缓存是mapper级别的缓存: 多个sqlSession操作同一个Mapper的SQL语句,
多个sqlSession可以共用二级缓存, 二级缓存是跨sqlSession的.
二级缓存原理图:
sqlSession和事务绑定, service方法结束sqlSession就消失, 也就是一级缓存消失
如果在同一个service方法中不使用sqlSession的增, 删, 改操作, 尽管是不同的mapper方法, 调用的还是一级缓存,
而如果是不同的service方法, 一级缓存就会在一个servcie方法结束时消失
1. 在sqlMapConfig.xml中开启缓存总开关
2. 在需要开启缓存的mapper中开启缓存子开关(本例是UserMapper.xml)
3. pojo实现序列化接口
二级缓存测试代码:
以上的sqlSession3是用于commit操作的
禁用缓存:
这样配置之后, 尽管不关闭sqlSession, 也会在每次查询的时候都发送sql语句. 需要从数据库中获取最新的数据的时候要
设置成禁用二级缓存.
刷新缓存就是清空缓存.
二级缓存-整合ehcache
ehcache是一个分布式缓存框架, 为了提高系统的并发性能, 一般对系统进行分布式部署(集群部署方式)
如果不使用分布式缓存, 缓存的数据将存储在各自的服务器中, 比如用户只要登录一次就好, 不需要每一台服务器中
都要验证用户是否登录, 如果不使用分布式缓存框架, 将不方便系统开发, 但是mybatis不具备缓存数据集中管理的能力,
需要和其他的分布式缓存框架进行整合
下面是常用的分布式框架:
mybatis默认实现的cache类:
加入ehcache整合包:
配置:
在classpath下加入ehcache.xml配置文件:
测试--------------------------------------略------------------------------
.............还有其他的参数