MyBatis 有一级和二级缓存,还有一个可以借助第三方缓存实现的自定义缓存。
1. 一级缓存:
-
一级缓存也叫本地(会话)缓存。作用域在Sqlsession(即,从sqlsession创建到sqlsession close)
-
查询同一个数据时,第一次会去访问数据库,后面直接从缓存中获取。结果如下:
可以看出,两次查询只有一次执行了sql查询语句。 -
如果数据库在第二次查询之前,进行了增删改操作,则会刷新缓存,第二次还会从数据库查询。
-
同上,如果中间执行了
sqlSeesion.clearCache();
也会刷新缓存。 -
当然,从不同的mapper.xml进行查询肯定也是两次查询(连二级缓存都不是,当然要两次)。
-
一级缓存默认开启,无法关闭。
-
一级缓存没啥用。
2. 二级缓存:
- 要开启全局二级缓存,需要在映射文件中(mapper.xml)中加入
<cache/>
我个人建议不要这样简略的单单这样使用。官网中说明这样配置的效果为:
- 映射语句文件中的所有 select 语句的结果将会被缓存。
- 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
- 缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来清除不需要的缓存。
- 缓存不会定时进行刷新(也就是说,没有刷新间隔)。
- 缓存会保存列表或对象(无论查询方法返回哪种)的 1024 个引用。
- 缓存会被视为读/写缓存,这意味着获取到的对象并不是共享的,可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。
应该高级配置:
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"/>
只读的缓存会给所有调用者返回缓存对象的相同实例。 因此这些对象不能被修改。这就提供了可观的性能提升。而可读写的缓存会(通过序列化)返回缓存对象的拷贝。 速度上会慢一些,但是更安全,因此默认值是 false。
所以采用读写的时候要实现序列化接口Serializable。
- 作用域为cache标签所在的作用域
- 默认的清除策略是 LRU。
- 开启缓存时还要再config中进行setting的配置:
<!--显示的开启全局缓存-->
<setting name="cacheEnabled" value="true"/>
- 二级缓存是事务性的。当sqlseesion 完成或完成回滚时,且没有执行刷新缓存的操作,会把缓存中的数据保存到二级缓存。
用户进行查询的时候会先搜索二级缓存,如果二级缓存没有,再搜索一级缓存,最后查询数据库。
-
什么是缓存 [ Cache ]?
- 存在内存中的临时数据。
- 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。
-
为什么使用缓存?
- 减少和数据库的交互次数,减少系统开销,提高系统效率。
-
什么样的数据能使用缓存?
- 经常查询并且不经常改变的数据。【可以使用缓存】
狂神迷弟在此!!!狂神保佑我找到工作。明天再总结一下,就能结束Mybatis了。