一级缓存的应用(自动开启,创建Sqlsession)
正式开发,是将mybatis和spring进行成和开发,事务控制在service中。一个service方法中包括很多mapper方法的调用。
Service 开始执行时, 开启事务(创建sqlSession对象)
第一次调用 mapper 的方法 findUserById(1)
第二次调用mapper 的方法 findUserById(1) ,从一级缓存中取数据。
方法结束,sqlSession 关闭。
SqlSession 一关闭 一级缓存就消失。 或者 commit一下 更新时缓存清空。
如果 执行两次service ,调用相同的用户信息,不走一级缓存,因为执行完第一个一级缓存,SqlSession 已经被清空。走二级缓存。
二级缓存 (需要手动开启缓存)
SqlSession1 查询用户id为1的用户信息,查询到的用户信息,查询到用户信息在SqlSession1 的close时候会将查询数据存储到二级缓存中。
SqlSession2 去查询用户的I为1的用户,去缓存中找是否存在数据,如果存在直接从缓存中取出数据。
二级缓存比一级缓存的范围更大,多个SQLSession可以共享一个Mapper的二级缓存区域。 UserMapper 有自己的缓存区域, OrderMapper 也有自己的缓存区域。(每一个缓存区域是按照namespace分的,有一个namespace的mapper 就有一个二级缓存区域。)
如果两个mapper 的namespace 相同,那么这两个mapper 共享一个二级缓存区域。
如果SqlSession3 去执行commit提交,那么二级缓存将会清空。
设置方法
1. 需要在 sqlMapConfig.xml 中 设置 setting标签下
<!-- 开启二级缓存 二级缓存总开关默认为FALSE -->
<setting name="cacheEnable" value="true"/>
2. 还需要在具体的mapper.xml 中设置打开二级缓存
在 mapper 标签中 加入 <cache/>
3.设置pojo类实现序列化接口
pojo类实现 Serializable 接口即可。