内存中的一块存储空间,服务于某个应用程序,旨在将频繁读取的数据临时保存在内存中,便于二次快速访问。
无缓存:用户在访问相同数据时,需要发起多次对数据库的直接访问,导致产生大量IO、读写硬盘的 *** 作,效率低下 |
---|
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7SGznRVE-1652530810458)(Pictures/012.png)] |
有缓存:首次访问时,查询数据库,将数据存储到缓存中;再次访问时,直接访问缓存,减少IO、硬盘读写次数、提高效率 |
---|
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l8fce0Q2-1652530810459)(Pictures/013.png)] |
SqlSession级别的缓存,同一个SqlSession的发起多次同构查询,会将数据保存在一级缓存中。
- 注意:无需任何配置,默认开启一级缓存。
SqlSessionFactory级别的缓存,同一个SqlSessionFactory构建的SqlSession发起的多次同构查询,会将数据保存在二级缓存中。
- 注意:在sqlSession.commit()或者sqlSession.close()之后生效。
< settings >是MyBatis中极为重要的调整设置,他们会改变MyBatis的运行行为,其他详细配置可参考官方文档。
<configuration>
<properties .../>
<settings>
<setting name="cacheEnabled" value="true"/>
settings>
<typeAliases>typeAliases>
configuration>
12.2.2 指定Mapper缓存
<mapper namespace="com.qf.mybatis.part2.cache.BookDao">
<cache />
<select id="selectBookByCondition" resultType="com.qf.mybatis.part2.cache.Book">
SELECT * FROM t_books
select>
mapper>
@Test
public void testMapperCache(){
SqlSession sqlSession1 = MyBatisUtils.getSession();
BookDao bookDao1 = sqlSession1.getMapper(BookDao.class);
bookDao1.selectBookByCondition(new Book());
sqlSession1.close(); //必须关闭SqlSession才可缓存数据
//--------------------
SqlSession sqlSession2 = MyBatisUtils.getSession();
BookDao bookDao2 = sqlSession2.getMapper(BookDao.class);
bookDao2.selectBookByCondition(new Book());
sqlSession2.close(); //缓存击中
}
12.2.3 缓存清空并重新缓存
@Test
public void testMapperCache(){
SqlSession sqlSession1 = MyBatisUtils.getSession();
BookDao bookDao1 = sqlSession1.getMapper(BookDao.class);
bookDao1.selectBookByCondition(new Book());
sqlSession1.close(); //必须关闭SqlSession才可缓存数据
//--------------------
SqlSession sqlSession3 = MyBatisUtils.getSession();
BookDao bookDao3 = sqlSession3.getMapper(BookDao.class);
bookDao3.deleteBookById(102);
sqlSession3.commit(); //DML成功,数据发生变化,缓存清空
sqlSession3.close();
//--------------------
SqlSession sqlSession2 = MyBatisUtils.getSession();
BookDao bookDao2 = sqlSession2.getMapper(BookDao.class);
bookDao2.selectBookByCondition(new Book());
sqlSession2.close(); //缓存未击中,重新查询数据库、重新缓存
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)