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配置文件:

    

测试--------------------------------------略------------------------------

 

  

 

 

 

 .............还有其他的参数

 

 

 

  

 

posted @ 2017-02-25 21:07  半生戎马,共话桑麻、  阅读(111)  评论(0)    收藏  举报
levels of contents