Mybatis缓存原理以及数据库缓存策略

mybatis缓存

一级缓存介绍

Executor与Sqlsession的关系就像市长与书记,Sqlsession只是个门面,真正干事的是Executor,Sqlsession对数据库的操作都是通过Executor来完成的。与Sqlsession一样,Executor也是动态创建的:

LocalCache本质是一个hashMap,使用CacheKey来存取;CacheKey由五个参数决定,Statement id + offset + limit + params + sql。

Mybatis缓存原理以及数据库缓存策略_第1张图片

一级缓存工作流程

一级缓存命中与未命中的具体流程,如下图:

二级缓存介绍

在上文中提到的一级缓存中,其最大的共享范围就是一个SqlSession内部,如果多个SqlSession之间需要共享缓存,则需要使用到二级缓存。开启二级缓存后,会使用CachingExecutor装饰Executor,进入一级缓存的查询流程前,先在CachingExecutor进行二级缓存的查询,具体的工作流程如下所示。

二级缓存是在sqlsession调用commit后刷新缓存;

insert + delete + update 后更新缓存...(具体如何更新........)// todo 

 

mybatis缓存总结

  1. MyBatis的二级缓存相对于一级缓存来说,实现了SqlSession之间缓存数据的共享,同时粒度更加的细,能够到namespace级别,通过Cache接口实现类不同的组合,对Cache的可控性也更强。
  2. MyBatis在多表查询时,极大可能会出现脏数据,有设计上的缺陷,安全使用二级缓存的条件比较苛刻。
  3. 在分布式环境下,由于默认的MyBatis Cache实现都是基于本地的,分布式环境下必然会出现读取到脏数据,需要使用集中式缓存将MyBatis的Cache接口实现,有一定的开发成本,直接使用Redis,Memcached等分布式缓存可能成本更低,安全性也更高。

对介绍了MyBatis一二级缓存的基本概念,并从应用及源码的角度对MyBatis的缓存机制进行了分析。最后对MyBatis缓存机制做了一定的总结,个人建议MyBatis缓存特性在生产环境中进行关闭,单纯作为一个ORM框架使用可能更为合适。

 

数据库分布式缓存

...

...个人认为只是把一级缓存二级缓存更换一种形式 置于 redis,memcached的服务上而已..

 

 

你可能感兴趣的:(数据库)