Mybatis——缓存

MyBatis 有一级和二级缓存,还有一个可以借助第三方缓存实现的自定义缓存。

1. 一级缓存:
  • 一级缓存也叫本地(会话)缓存。作用域在Sqlsession(即,从sqlsession创建到sqlsession close)

  • 查询同一个数据时,第一次会去访问数据库,后面直接从缓存中获取。结果如下:
    在这里插入图片描述
    可以看出,两次查询只有一次执行了sql查询语句。

  • 如果数据库在第二次查询之前,进行了增删改操作,则会刷新缓存,第二次还会从数据库查询。

  • 同上,如果中间执行了sqlSeesion.clearCache();也会刷新缓存。

  • 当然,从不同的mapper.xml进行查询肯定也是两次查询(连二级缓存都不是,当然要两次)。

  • 一级缓存默认开启,无法关闭。

  • 一级缓存没啥用。


2. 二级缓存:
  • 要开启全局二级缓存,需要在映射文件中(mapper.xml)中加入<cache/>我个人建议不要这样简略的单单这样使用。官网中说明这样配置的效果为:
  1. 映射语句文件中的所有 select 语句的结果将会被缓存。
  2. 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
  3. 缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来清除不需要的缓存。
  4. 缓存不会定时进行刷新(也就是说,没有刷新间隔)。
  5. 缓存会保存列表或对象(无论查询方法返回哪种)的 1024 个引用。
  6. 缓存会被视为读/写缓存,这意味着获取到的对象并不是共享的,可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。

应该高级配置:

<cache
  eviction="FIFO"
  flushInterval="60000"
  size="512"
  readOnly="true"/>

只读的缓存会给所有调用者返回缓存对象的相同实例。 因此这些对象不能被修改。这就提供了可观的性能提升。而可读写的缓存会(通过序列化)返回缓存对象的拷贝。 速度上会慢一些,但是更安全,因此默认值是 false。

所以采用读写的时候要实现序列化接口Serializable

  • 作用域为cache标签所在的作用域
  • 默认的清除策略是 LRU。
  • 开启缓存时还要再config中进行setting的配置:
<!--显示的开启全局缓存-->
<setting name="cacheEnabled" value="true"/>
  • 二级缓存是事务性的。当sqlseesion 完成或完成回滚时,且没有执行刷新缓存的操作,会把缓存中的数据保存到二级缓存。
用户进行查询的时候会先搜索二级缓存,如果二级缓存没有,再搜索一级缓存,最后查询数据库。
  1. 什么是缓存 [ Cache ]?

    • 存在内存中的临时数据。
    • 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。
  2. 为什么使用缓存?

    • 减少和数据库的交互次数,减少系统开销,提高系统效率。
  3. 什么样的数据能使用缓存?

    • 经常查询并且不经常改变的数据。【可以使用缓存】

狂神迷弟在此!!!狂神保佑我找到工作。明天再总结一下,就能结束Mybatis了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值