写在前面
很久以前在有道云笔记上写的笔记,打算放弃它了,将笔记迁移到这里来。文章可能还有很多不足,请大家谅解,欢迎大佬提意见。
本文使用到的东西
- MyBatis
- java
1.一级缓存默认是开启的,
--不同SqlSession缓存不能共享
MyBatis 默认开启了一级缓存,一级缓存是在SqlSession 层面进行缓存的。即,同一个SqlSession ,多次调用同一个Mapper和同一个方法的同一个参数,只会进行一次数据库查询,然后把数据缓存到缓冲中,以后直接先从缓存中取出数据,不会直接去查数据库。
但是不同的SqlSession对象,因为不用的SqlSession都是相互隔离的,所以相同的Mapper、参数和方法,他还是会再次发送到SQL到数据库去执行,返回结果。
2.二级缓存
- 默认二级缓存是不开启的,需要手动进行配置。
- 映射文件所有的select 语句会被缓存
- 映射文件的所有的insert、update和delete语句会刷新缓存
- 缓存会使用默认的Least Recently Used(LRU,最近最少使用原则)的算法来回收缓存空间
- 根据时间表,比如No Flush Interval,(CNFI,没有刷新间隔),缓存不会以任何时间顺序来刷新
- 缓存会存储列表集合或对象(无论查询方法返回什么)的1024个引用
- 缓存会被视为是read/write(可读/可写)的缓存,意味着对象检索不是共享的,而且可以很安全的被调用者修改,不干扰其他调用者或线程所作的潜在修改
3.xml的映射器使用二级缓存
- 在mybatis-config配置中开启缓存
<configuration>
<settings>
<!-- 全局映射器启用缓存, 默认为true -->
<setting name="cacheEnabled" value="true" />
<setting name="logImpl" value="STDOUT_LOGGING" ></setting>
</settings>
</configuration>
- 在映射器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"/> <!--只读-->
- commit后才生效. 当使用二级缓存时候,sqlSession需要使用commit时候才会生效,并且必须在运行接口实现类之后
如:
//如何获取连接?
SqlSession session = MyBatisSessionFactory.getSession();
//如何获取dao的实现类?
StudentDao dao = session.getMapper(StudentDao.class);
//查询
Student p = dao.findById(1);
session.commit();
2.总结
很久以前在有道云笔记上写的笔记,打算放弃它了,将笔记迁移到这里来。有不清楚的地方欢迎评论留言,看到的我都会回复的。本文到此结束,有什么不足的地方请大家不吝指正。