一、一级缓存
1.一级缓存真是存在
2.一级缓存的依据是ID+SQL字句
· 3.增删改会清空一级缓存
一级缓存案例:
一级缓存Test测试类
@Test public void test5(){ SmbmsRoleEntity allByRoleId = providerTest.getAllByRoleId(3); System.out.println(allByRoleId.getRoleName()); //使用同一个SQLSession发送 相同发的SQL并且执行大的是同一个ID //增删改:都会清空一级缓存 System.out.println("========================="); SmbmsRoleEntity allByRoleId2 = providerTest.getAllByRoleId(3); System.out.println(allByRoleId2.getRoleName()); }
一级缓存结果
使用同一SqlSession向数据库发送相同的请求时,第一条 会请求数据库发送SQL其余的不会请求数据库直接从缓存中拿数据
增删改对一级缓存的影响Test测试类
@Test public void test5(){ SmbmsRoleEntity allByRoleId = providerTest.getAllByRoleId(3); System.out.println(allByRoleId.getRoleName()); //使用同一个SQLSession发送 相同发的SQL并且执行的是同一个ID //增删改:都会清空一级缓存
System.out.println("=============修改============="); int upda = providerTest.upda("普通用户", 3); System.out.println("========================="); SmbmsRoleEntity allByRoleId2 = providerTest.getAllByRoleId(3); System.out.println(allByRoleId2.getRoleName()); }
增删改对一级缓存的影响结果
一级缓存在 增删改情况下,无论是否提交事务,都会重新执行数据库擦查询(清空缓存)
二、二级缓存
- 二级缓存不比一级缓存,需要在configuration.xml中手动开启。
- 二级缓存是全局应用级别的缓存,即使关闭了session仍能使用。
- 如果一个select标签想要局部关闭二级缓存,需要设置useCache=false
- 二级缓存不能使用注解方法配置
- 如果在执行增删改操作的过程中不刷新缓存,须设置flushCache=false
1.二级缓存不比一级缓存,需要在mybatis-.xml中手动开启
<!--开启二级缓存--> <setting name="cacheEnabled" value="true"/>
2.在小配置文件中配置cache节点
<cache/>
3.在使用到的实体类中实现Serializable接口
二级缓存测试类
@Test public void test5(){ SmbmsRoleEntity allByRoleId = providerTest.getAllByRoleId(3); System.out.println(allByRoleId.getRoleName()); //使用同一个SQLSession发送 相同发的SQL并且执行大的是同一个ID //增删改:都会清空一级缓存 System.out.println("=============修改============="); int upda = providerTest.upda("普通用户", 3); System.out.println("========================="); SmbmsRoleEntity allByRoleId2 = providerTest.getAllByRoleId(3); System.out.println(allByRoleId2.getRoleName()); }
二级测试类控制台
二级缓存在增删改情况下,如果提交事务则会清空缓存,重新查询,如果不提交事务,则获取缓存数据