Mybatis一级缓存与二级缓存

来源:互联网 发布:网络市场监管现状 编辑:程序博客网 时间:2024/05/01 19:58

一级缓存

一级缓存是针对每一个sqlSession进行缓存。每个sqlSession对象中使用Map存储一级缓存数据,
map中存储了sql执行查询的结果集(java对象)。

生命周期

第一次查询先去缓存中找是否有缓存数据,发现没有,查询数据库,将查询到的数据写入sqlsession的一级缓存区域。
第二次查询先去缓存中找是否有缓存数据,发现有,直接从缓存区域中取出数据返回。
如果 执行sqlsession的添加、修改、删除等操作,会执行commit,最终会清空缓存。sqlSession对象销毁其中一级缓存数据不存在了。sqlSession与SqlSession之间的一级缓存互相不影响。


二级缓存

二级缓存是针对每个mapper相同 的namespace进行缓存。每个SqlSession都要调用mapper下的sql语句,在mapper级别设置了二级缓存的数据结构map,每个mapper对应一个map数据结构,map中存储了二级缓存的数据,存储了sql执行查询的结果集(java对象)。
每个SqlSession都可以访问到二级缓存中的数据,sqlsession对象销毁mapper中的二级缓存数据仍然存在。

生命周期

不同的sqlsession都要调用mapper下的sql语句发起数据库请求。
sqlsession1执行UserMapper下的查询用户请求先从二级缓存中查找有没有数据,如果没有就从数据库中查询,并且将查询到数据存储二级缓存中。

sqlsession2执行UserMapper下的同一个查询用户请求,先从二级缓存中查找有没有数据,如果有就从二级缓存中查询数据,返回。

如果有一个sqlsession3执行UserMapper下添加、修改、删除语句,执行commit操作后,将UserMapper下的所有缓存数据全部清空。

二级缓存需要手动打开

打开总开关:
在核心配置文件SqlMapConfig.xml中加入

<!--注意顺序--><setting name="cacheEnabled" value="true"/>

打开mapper的二级缓存开关:
在mapper.xml配置文件中加入标签
将要查询的pojo类实现序列化接口即`implements Serializable

二级缓存是跨sqlsession的是基于mapper级别的缓存,sqlsession可以使用多个对象,多个对象必须要访问同一个mapper下的sql语句
关闭sqlsession是,才会将数据写入二级缓存`