自己网站内容怎么才能被百度抓取,网站开发怎样手机号验证,企业网络营销培训,vi设计说明模板以下场景均在Spring Boot程序中#xff0c;并非手动创建SqlSession使用。 在回答这个问题之前#xff0c;我们先来回顾一下#xff0c;Mybatis的一级二级缓存是啥。
一级二级缓存
是什么
一级缓存#xff08;本地缓存#xff09;#xff1a;一级缓存是SqlSession级别的… 以下场景均在Spring Boot程序中并非手动创建SqlSession使用。 在回答这个问题之前我们先来回顾一下Mybatis的一级二级缓存是啥。
一级二级缓存
是什么
一级缓存本地缓存一级缓存是SqlSession级别的缓存当我们执行查询时MyBatis会先将查询结果放在当前SqlSession的缓存中如果后续有相同的查询MyBatis会直接从缓存中取出结果而不会再次执行 SQL 查询。二级缓存全局缓存二级缓存是 Mapper 级别的缓存它可以被多个SqlSession共享。当一个SqlSession 查询数据时MyBatis会先在一级缓存中查找如果没有找到再去二级缓存中查找如果还没有找到最后才会去数据库查询。
缓存类型生命周期如何开启位置一级缓存随SqlSession的生命周期默认启用无法关闭BaseExecutor的localCache参数中二级缓存跟随程序的生命周期xml文件标识cache/或者使用CacheNamespace注解MappedStatement中的cache参数
问题
回到问题本身其实就是一个缓存生命周期的回答是否每次都会使用呢并不是得看是如何使用的。有两种情况
显式使用SqlSession在查询后没有显式调用clearCache并且在同一个上下文二次查询后缓存使用。
try (SqlSession session sqlSessionFactory.openSession()) {// 第一次查询将结果放入缓存session.select();// 第二次查询直接使用上一次的搜索结果session.select();// 清除缓存session.clearCache();
}由Spring容器管理的SqlSession在Spring中每次调用Mapper的方法都会创建一个新的SqlSession自然而然也不会使用缓存了。当然开启了事务另说。
题外话
有没有什么额外回答能在回答的时候加一下分呢那么我们就要想想在什么场景下使用了上一次的搜索结果会有问题呢没错就是它数据库的事务隔离级别在MySQL中不同的事务隔离级别对查询起着不同的影响。其中在可重复读REPEATABLE READ以下的级别都会受到Mybatis一级二级缓存的影响。那么为什么呢读未提交READ UNCOMMITTED、读已提交READ COMMITTED都可以在事务查询时获取到其他事务的结果所以如果使用了Mybatis的缓存的话就跟数据库的查询结果不一致了。