mybatis 总架构
1 数据缓存设计结构
1.1 一级缓存
Session会话级别的缓存,位于表示一次数据库会话的SqlSession
对象之中,即本地缓存
。
一级缓存是MyBatis内部实现的一个特性,用户不能配置
,默认自动支持
,用户无定制权利。
1.2 二级缓存
应用级别的缓存,生命周期长,跟应用的生命周期一样,即作用范围为整个应用。
默认关闭,也不建议使用,一般用Redis第三方来替代。
- 缓存架构
2 工作机制
2.1 一级缓存的工作机制
一级缓存是Session级别,一般一个SqlSession对象会使用一个Executor对象来完成会话操作,Executor对象会维护一个Cache缓存,以提高查询性能,减少对DB的压力。
2.2 二级缓存的工作机制
如果用户配置了cacheEnabled=true,那么在为SqlSession对象创建Executor对象时,会对Executor对象加上一个装饰者 CachingExecutor,这时SqlSession使用CachingExecutor对象完成操作请求。
CachingExecutor对查询请求,会先判断该查询请求在Application级别的二级缓存中是否有缓存结果
- 有查询结果
直接返回缓存结果 - 缓存未命中
再交给真正的Executor对象来完成查询操作,之后CachingExecutor会将真正Executor返回的查询结果放置到缓存中,然后再返回给用户
MyBatis二级缓存设计灵活,可以使用:
- MyBatis自己定义的二级缓存实现
- 实现org.apache.ibatis.cache.Cache接口自定义缓存
- 使用第三方内存缓存库,如Memcached
3 使用
MyBatis:
<cache type="org.mybatis.caches.ehcache.LoggingEhcache" > <property name="memoryStoreEvictionPolicy" value="LRU"/> </cache> <select id="selectArticleListPage" resultMap="resultUserArticleList" useCache="false" >
一级缓存有没有问题?
public void query() { SqlSession sqlsesion; sqlsession.selectOne(); // 被update,下面语句就会是脏数据 sqlsession.selectOne(); //命中缓存 内存 }
为什么还这样设计呢?你会写这样写代码的概率很低。