Mybatis的缓存机制及其使用

一、什么是缓存(Cache),缓存有什么作用

(1)存在内存中的临时数据。

(2)将用户经常查询的数据放在缓存(内存)中,用户查询数据时就不需要在从磁盘上(关系型数据库数据文件)查询,直接从缓存中查询;从而提高了查询效率,解决了高并发系统的性能问题。

(3)什么样的数据能使用缓存:经常查询且不经常改变的数据。

作用:减少了和数据库的交互次数,减少了系统的开销,提高了系统效率;

二、Mybatis的缓存

(1) MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极大的提升查询效率。

(2)MyBatis 系统中默认定义了两级缓存:一级缓存和二级缓存

a、默认情况下,只有一级缓存开启。( SqlSession 级别的缓存,也称为本地缓存)。

b、二级缓存需要手动开启和配置,他是基于 namespace 级别的缓存。

c、为了提高扩展性, MyBatis 定义了缓存接口 Cache ,我们可以通过实现 Cache 接口来自定义二级缓存。

三、一级缓存

缓存失效的情况:

1、查询不同的东西

2、增删改操作,改变了原来的数据

3、查询了不同的Mapper.xml

4、手动清理了缓存

手动清理缓存:

sqlSession.clearCache();

小结:一级缓存默认开启的,只在一次sqlSession中有效,也就是拿到连接和关闭连接这个区间中有效,一级缓存就是一个Map。

四、二级缓存

(1)二级缓存也叫全局缓存,一级缓存作用城太低了,所以诞生了二级缓存

(2)基于 namespace 级别的缓存,一个名称空间,对应一个二级缓存;

(3)工作机制:
a、一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中;
b、如果当前会话关闭了,这个会话对应的一级缓存就没了:但是我们想要的是,会话关闭了,一c级缓存中的数据被保存到二级缓存中;
d、新的会话查询信息,就可以从二级缓存中获取内容;
e、不同的 mapper 查出的数据会放在自己对应的缓存( map )中;

实现二级缓存的步骤;:

(1)开启全局缓存:

<settings>
        <setting name="cacheEnabled" value="true"/>
</settings>

(2)Mapper中开启二级缓存

直接开启:

<cache/>

自定义参数:

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

小结:

(1)只要开启二级缓存在同一个Mapper下就有效

(2)所有的数据会先放在一级缓存中

(3)只有当会话提交时,或者关闭时,才会提交到二级缓存中

五、自定义缓存--ehcache

Ehcache是一种广泛使用的开源Java分布式缓存,主要面向通用缓存

(1)使用时要导包:

<!-- https://mvnrepository.com/artifact/org.mybatis.caches/mybatis-ehcache -->
<dependency>
    <groupId>org.mybatis.caches</groupId>
    <artifactId>mybatis-ehcache</artifactId>
    <version>1.2.1</version>
</dependency>

(2)Mapper中:

<cache type="org.mybatis.caches.ehcacheCache"/>

(3)配置缓存:

<defaultCache
maxElementsInMemory="10000"
//缓存中最大允许创建的对象数
eternal="false"
//缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期
timeToIdleSeconds="120"
//缓存数据钝化时间(设置对象在它过期之前的空闲时间)
timeToLiveSeconds="120"
//缓存数据的生存时间(设置对象在它过期之前的生存时间)
overflowToDisk="true"
//内存不足时,是否启用磁盘缓存
/>

下面是自己的ehcache.xml 的配置

<ehcache>

     <!-- 
  设置缓存文件 .data 的创建路径。
  如果该路径是 Java 系统参数,当前虚拟机会重新赋值。
  下面的参数这样解释:参考http://www.wityx.com
  user.home      – 用户主目录
  user.dir       – 用户当前工作目录
  java.io.tmpdir – 默认临时文件路径 
 -->
    <diskStore path="java.io.tmpdir"/>

    <!-- 缺省缓存配置。CacheManager 会把这些配置应用到程序中。

        下列属性是 defaultCache 必须的:

        maxInMemory           - 设定内存中创建对象的最大值。
        eternal               - 设置元素(译注:内存中对象)是否永久驻留。如果是,将忽略超时限制且元素永不消亡。
        timeToIdleSeconds     - 设置某个元素消亡前的停顿时间。
                                       也就是在一个元素消亡之前,两次访问时间的最大时间间隔值。
                                       这只能在元素不是永久驻留时有效(译注:如果对象永恒不灭,则
                                       设置该属性也无用)。
                                       如果该值是 0 就意味着元素可以停顿无穷长的时间。
        timeToLiveSeconds    - 为元素设置消亡前的生存时间。
                                       也就是一个元素从构建到消亡的最大时间间隔值。
                                       这只能在元素不是永久驻留时有效。
        overflowToDisk        - 设置当内存中 缓存达到 maxInMemory 限制时元素是否可写到磁盘
                                       上。
        -->

    <defaultCache name="com.cader.MethodCache"
        maxElementsInMemory="10000"
        eternal="false"
        overflowToDisk="true"
        timeToIdleSeconds="120"
        timeToLiveSeconds="120"
        diskPersistent="false"
        diskExpiryThreadIntervalSeconds="120"
        />
</ehcache>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值