mybatis的一级缓存和二级缓存
mybatis设计两级缓存来提高查询效率。
一级缓存是SqlSession级别,每个会话都需要创建一个sqlsession,避免同一个用户在多次查询中每次都去查询数据库就把查询结果做了缓存
二级缓存
跨SqlSession的缓存,以及缓存是无法做到的,所以引入了二级缓存。当多个用户在查询数据的时候只要有任何一个SqlSeesion拿到了数据,放到SqlSession里面,其他用户就可以直接拿到数据
实现原理:
一级缓存:每个SqlSession都会有一个Executor,每个Executor都会持有一个LocalCache得对象,当发起查询的时候会先去LocalCache中去查询,如果命中就直接返回,没命中就去数据库查。
所以一级缓存的生命周期是SqlSession。分布式下可能会有脏读
二级缓存
是在原来的Executor上做了一个装饰,引入一个装饰器叫CachingExecutor,所以进入以及缓存查询前会先去查二级缓存(如果开了二级缓存),开启二级缓存会被多个SqlSession 共享,他是一个全局得缓存。流程是 先二级缓存–一级缓存–数据库。缓存力度控制到nameSpace级别
一级缓存的作用范围是 SqlSession 的生命周期,二级缓存的作用范围是整个应用程序的生命周期。
一级缓存默认开启
并且无法关闭;
二级缓存默认关闭
需要手动开启并进行配置。