写在前面

很久以前在有道云笔记上写的笔记,打算放弃它了,将笔记迁移到这里来。文章可能还有很多不足,请大家谅解,欢迎大佬提意见。

本文使用到的东西

  1. MyBatis
  2. java

1.一级缓存默认是开启的,

--不同SqlSession缓存不能共享
​ MyBatis 默认开启了一级缓存,一级缓存是在SqlSession 层面进行缓存的。即,同一个SqlSession ,多次调用同一个Mapper和同一个方法的同一个参数,只会进行一次数据库查询,然后把数据缓存到缓冲中,以后直接先从缓存中取出数据,不会直接去查数据库。
​ 但是不同的SqlSession对象,因为不用的SqlSession都是相互隔离的,所以相同的Mapper、参数和方法,他还是会再次发送到SQL到数据库去执行,返回结果。

2.二级缓存

  1. 默认二级缓存是不开启的,需要手动进行配置。
  2. 映射文件所有的select 语句会被缓存
  3. 映射文件的所有的insert、update和delete语句会刷新缓存
  4. 缓存会使用默认的Least Recently Used(LRU,最近最少使用原则)的算法来回收缓存空间
  5. 根据时间表,比如No Flush Interval,(CNFI,没有刷新间隔),缓存不会以任何时间顺序来刷新
  6. 缓存会存储列表集合或对象(无论查询方法返回什么)的1024个引用
  7. 缓存会被视为是read/write(可读/可写)的缓存,意味着对象检索不是共享的,而且可以很安全的被调用者修改,不干扰其他调用者或线程所作的潜在修改

3.xml的映射器使用二级缓存

  1. 在mybatis-config配置中开启缓存
<configuration>
    <settings>
        <!-- 全局映射器启用缓存, 默认为true -->
        <setting name="cacheEnabled" value="true" />
        <setting name="logImpl" value="STDOUT_LOGGING" ></setting>
    </settings>
</configuration>
  1. 在映射器Mapper中设置缓存
<mapper namespace="com.etc.dao.StudentDao">
<cache eviction="fifo" flushInterval="3600" size="100000" readOnly="true">
</cache>
</mapper>

说明:

<cache 
eviction="FIFO"  <!--回收策略为先进先出-->
flushInterval="60000" <!--自动刷新时间60s-->
size="512" <!--最多缓存512个引用对象-->
readOnly="true"/> <!--只读-->
  1. commit后才生效. 当使用二级缓存时候,sqlSession需要使用commit时候才会生效,并且必须在运行接口实现类之后
    如:
        //如何获取连接?
        SqlSession session = MyBatisSessionFactory.getSession();
        //如何获取dao的实现类?
        StudentDao dao = session.getMapper(StudentDao.class);
        //查询
        Student p = dao.findById(1);  
        session.commit(); 

2.总结

很久以前在有道云笔记上写的笔记,打算放弃它了,将笔记迁移到这里来。有不清楚的地方欢迎评论留言,看到的我都会回复的。本文到此结束,有什么不足的地方请大家不吝指正。