文章目录
缓存
(1) 什么是缓存?
存在于内存中的临时数据。
(2)为什么使用缓存
减少和数据库的交互次数,提高执行效率。
(3)什么样的数据能使用缓存,什么样的数据不能使用
适用于缓存:
经常查询并且不经常改变的。
数据的正确与否对最终结果影响不大的。
不适用于缓存:
经常改变的数据
数据的正确与否对最终结果影响很大的。
例如:商品的库存,银行的汇率,股市的牌价。
存在问题:
缓存与数据库中的数据不同步问题:
所以数据的正确与否对最终结果影响不大的,推荐使用缓存。
(4)Mybatis中的一级缓存和二级缓存
一级缓存(SqlSession缓存):
它指的是Mybatis中SqlSession对象的缓存。
当我们执行查询之后,查询的结果会同时存入到SqlSession为我们提供一块区域中。
该区域的结构是一个Map。当我们再次查询同样的数据,mybatis会先去sqlsession中
查询是否有,有的话直接拿出来用。
当SqlSession对象消失时,mybatis的一级缓存也就消失了。
清空以及缓存的方法: sqlSession.close() sqlSession.clearCache() sqlSession.flush()
一级缓存是 SqlSession 范围的缓存,当调用 SqlSession 的修改,添加,删除,commit(),close()等方法时,就会清空一级缓存
可以进行测试:
利用同一个sqlSession对象 先查 在添加 在查,
看查的两次对象是否一致 ---> 不一致 ---> 看日志
得出: 当执行修改删的时候一级缓存会重新获取
(通过这种方式实现数据库与缓存中的数据同步)
二级缓存(SqlSessionFactory缓存):
它指的是Mybatis中SqlSessionFactory工厂对象的缓存。
由同一个SqlSessionFactory对象创建的SqlSession共享其缓存。
二级缓存的使用步骤:
第一步:让Mybatis框架支持二级缓存(在SqlMapConfig.xml主配置文件中配置)
<settings>
<!-- 开启二级缓存的支持 -->
<setting name="cacheEnabled" value="true"/>
</settings>
<!-- 因为 cacheEnabled 的取值默认就为 true,所以这一步可以省略不配置。为 true 代表开启二级缓存;为false 代表不开启二级缓存。-->
第二步:让当前的映射文件支持二级缓存(在IUserDao.xml映射文件中配置)
<mapper namespace="com.zy.dao.IUserDao">
<!-- 开启二级缓存的支持 -->
<cache></cache>
</mapper>
<!-- <cache>标签表示当前这个 mapper 映射将使用二级缓存,区分的标准就看 mapper 的 namespace 值。 -->
第三步:让当前的操作支持二级缓存(在select标签中配置)
<!-- 根据 id 查询 -->
<select id="findById" resultType="user" parameterType="int" useCache="true">
select * from user where id = #{uid}
</select>
<!-- 将 UserDao.xml 映射文件中的<select>标签中设置 useCache=”true”代表当前这个 statement 要使用二级缓存-->
<!-- 如果不使用二级缓存可以设置为 false。-->
<!-- 注意:针对每次查询都需要最新的数据 sql,要设置成 useCache=false,禁用二级缓存。-->
二级缓存中存放的是数据,而不是对象