Mybatis缓存

Mybatis缓存

MyBatis中的缓存相关类都在cache包下面,而且定义了一个顶级接口Cache,默认只有一个实现类PerpetualCache,PerpetualCache中是内部维护了一个HashMap来实现缓存。即Mybatis缓存的底层是通过HashMap来实现的

一级缓存

1.Mybatis的一级缓存是sqlSession级别的,即通过同一个sqlSession查询的数据会被缓存,再次使用同一个sqlSession查询同一条数据会从缓存中来获取
2.Mybatis的一级缓存默认是开启的

一级缓存失效的四种情况

a.不同的sqlSession对应不同的一级缓存
b.同一个sqlSession但是查询条件不同

Book book1=sqlSession.getMapper(BookMapper.class);
book1.getById(1);
Book book2=sqlSession.getMapper(BookMapper.class);
book2.getById(2);

c.同一个sqlSession两次查询期间执行了任何一次的增删改操作
因为做增删改操作,会自动清空缓存
d.同一个sqlSession两次查询期间手动清空了缓存

//通过clearCache()方法来清空缓存
sqlSession.clearCache();

二级缓存

1.Mybatis的二级缓存是SqlSessionFactory级别的,通过同一个SqlSessionFactory创建的SqlSession查询相同数据的结果会被缓存;此后若再次执行相同的查询语句,结果就会从缓存中获取。

2.开启二级缓存:

2.1 通过在mybatis的核心配置文件中,设置全局配置属性cacheEnabled="true"1这个不配置也行,因为默认就是true。
2.2 在Mapper映射文件内需要配置缓存标签:< cache/>在这里插入图片描述
2.3 二级缓存必须在sqlSession关闭或者提交后才生效

//关闭
sqlSession.close();
//提交
sqlSession.commit();

2.4 查询的数据所转换的实体类pojo必须要实现序列化的接口

3.二级缓存失效

如果两次查询之间执行了任意的增删改操作,会使一级和二级缓存同时失效

Mybatis缓存查询的顺序

先查询二级缓存,因为二级缓存可能会有其他程序已经查出来的数据,可以直接拿来使用
如果二级缓存没有命中,再查询一级缓存
如果一级缓存没有命中,则查询数据库
SqlSession关闭之后,一级缓存中的数据会写入二级缓存

整合第三方缓存EHCache(针对于二级缓存)

因为mybatis的二级缓存是可以使用第三方缓存的

EHCache

Ehcache是一种广泛使用的Java分布式缓存器,具有快速、精干等特点,是Hibernate中默认CacheProvider。它提供内存存储和磁盘存储两种方案,因此无需担心容量问题。Ehcache可以单独使用,一般在第三方库中被用到的比较多,如Hibernate、MyBatis等

因为Ehcache直接在JVM虚拟机中缓存,速度快,效率高,但是缓存共享十分麻烦,集群分布式应用不方便。Ehcache是通过RMI或者Jgroup多播方式进行广播缓存通知更新,缓存共享复杂,维护不方便。虽然Ehcache号称“分布式缓存器”,实际来看,口宣能力大于实际能力,当然,从商业角度来说,这也无可厚非。

整合EHCache

1.在pom.xml文件中导入依赖

<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>2.10.2</version>
</dependency>

2.在src/main/resources/创建一个配置文件 ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">

  <!-- 磁盘缓存位置 -->
  <diskStore path="F:\java_learn\ehcache"/>

  <!-- 默认缓存 -->
  <defaultCache
          maxEntriesLocalHeap="10000"
          eternal="false"
          timeToIdleSeconds="120"
          timeToLiveSeconds="120"
          maxEntriesLocalDisk="10000000"
          diskExpiryThreadIntervalSeconds="120"
          memoryStoreEvictionPolicy="LRU">
    <persistence strategy="localTempSwap"/>
  </defaultCache>

  <!—自定义缓存:MyCache -->
  <cache name="MyCache"
         maxElementsInMemory="1000"
         eternal="false"
         timeToIdleSeconds="5"
         timeToLiveSeconds="5"
         overflowToDisk="false"
         memoryStoreEvictionPolicy="LRU"/>
</ehcache>

3.在SQL映射文件中添加

//开启二级缓存
<cache />
//整合第三方缓存
<cache type="org.mybatis.caches.ehcache.EhcacheCache">
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值