浙江省住房和城乡建设厅官方网站,wordpress4.9.4下载,seo自然搜索优化排名,长春网长春网站设计站建设title1. 关于缓存的介绍2. 一级缓存#xff0c;默认开启#xff0c;session级别3. 二级缓存#xff0c;mapper 的namespace级别1. 关于缓存的介绍 Mybatis一级缓存的作用域是同一个SqlSession#xff0c;在同一个sqlSession中两次执行相同的sql语句#xff0c;第一次执行完…
title1. 关于缓存的介绍2. 一级缓存默认开启session级别3. 二级缓存mapper 的namespace级别1. 关于缓存的介绍 Mybatis一级缓存的作用域是同一个SqlSession在同一个sqlSession中两次执行相同的sql语句第一次执行完 毕会将数据库中查询到的数据写到缓存内存第二次会从缓存中获取数据将不再从数据库查询从而提 高查询效率。当一个sqlSession结束后该sqlSession中的一级缓存也就不存在了。Mybatis默认开启一级缓存。 Mybatis二级缓存是多个SqlSession共享的其作用域是mapper的同一个namespace不同的sqlSession两次执行 相同namespace下的sql语句且向sql中传递参数也相同即最终执行相同的sql语句第一次执行完毕会将数据库 中查询的数据写到缓存内存第二次会从缓存中获取数据将不再从数据库查询从而提高查询效 率。Mybatis默认没有开启二级缓存需要在setting全局参数中配置开启二级缓存。 如果二级缓存没有取到再从一级缓存中找如果一级缓存也没有从数据库查询。 2. 一级缓存默认开启session级别
一级缓存的清空
1、关于一级缓存的清空
一级缓存区域是根据SqlSession为单位划分的。
每次查询会先从缓存区域找
如果找不到从数据库查询查询
到数据将数据写入缓存。
Mybatis内部存储缓存使用一个HashMap
Key为hashCodesqlIdsql语句。value为从查
询出来映射生成的Java对象。
sqlSession执行insert、update、delete等操作commit提交后会清空缓存区域。一级缓存测试 // 一级缓存默认开启二级缓存的开启需要配置// 一级缓存的作用域当前sessionTestpublic void test1() {StuInfoMapper stuMapper sqlSession.getMapper(StuInfoMapper.class);StuInfo stu stuMapper.getStuInfoById(1);System.out.println(stu);// 这里是读取的缓存里面的stuStuInfo stu1 stuMapper.getStuInfoById(1);System.out.println(stu1);}只查询一次 脏读问题
简单的说基于mybatis中的缓存机制查询的结果是缓存中的结果数据未得到即时更新。 // 缓存带来的脏读问题// 这里不开启二级缓存Testpublic void test2() {// 第一个sessionSqlSession sqlSession1 sqlSessionFactory.openSession();StuInfoMapper stuInfoMapper1 sqlSession1.getMapper(StuInfoMapper.class);StuInfo stu1 stuInfoMapper1.getStuInfoById(1);System.out.println(stu1);// 第二个sessionSqlSession sqlSession2 sqlSessionFactory.openSession();StuInfoMapper stuInfoMapper2 sqlSession2.getMapper(StuInfoMapper.class);StuInfo stu2 stuInfoMapper2.getStuInfoById(1);System.out.println(stu2);// 实现commit 修改操作 清空session1, 重新查询stuInfoMapper1.updateStuInfoById(new StuInfo(1, jack--小李子,null, null, null));sqlSession1.commit();System.out.println( after update... );stu1 stuInfoMapper1.getStuInfoById(1);System.out.println(commit session1 重新查询.. stu1);stu2 stuInfoMapper2.getStuInfoById(1);System.out.println(一级缓存中的stu2, 脏读... stu2);} 3. 二级缓存mapper 的namespace级别
启用缓存 当前mapper 启用二级缓存 测试 // 二级缓存在所有session之间共享。Testpublic void test1() {// session1StuInfoMapper stuInfoMapper1 sqlSession.getMapper(StuInfoMapper.class);StuInfo stu1 stuInfoMapper1.getStuInfoById(1);// session1 关闭 缓存到二级缓存中sqlSession.close();System.out.println(stu1);// 先读二级缓存不会查询数据库SqlSession sqlSession2 sqlSessionFactory.openSession();StuInfoMapper stuInfoMapper2 sqlSession2.getMapper(StuInfoMapper.class);StuInfo stu2 stuInfoMapper2.getStuInfoById(1);System.out.println(stu2);}