Mybatis缓存

1.缓存

官方文档:https://mybatis.org/mybatis-3/zh/sqlmap-xml.html#cache

什么是缓存?

遇事不决先百度。

缓存是指可以进行高速数据交换的存储器。先于内存和CPU交换数据

不过这属于计算机硬件了。我的理解就是用于暂时保存在内存中的数据,不用每次都去磁盘上读取。

2.mybatis的缓存

MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制。 使用缓存可以极大的提高查询效率。

Mybatis默认有两个缓存:

  • 一级缓存:默认开启。SqlSession缓存,本地缓存。
  • 二级缓存:需要手动开启和配置,基于namespace级别的缓存。
  • 自定义缓存接口Cache,通过实现Cache接口来自定义二级缓存。

2.1 一级缓存

一级缓存具有的特性:默认开启,无法关闭

  • 与数据库同一次会话期间查询到的数据会放在本地缓存中。
  • 以后如果需要获取相同的数据,直接从缓存中读取即可,没必要再去查询数据库。
  • 在一个SqlSession内起作用。只对读取产生缓存,如果中间修改的话,会刷新缓存。

2.2 二级缓存

二级缓存又叫做全局缓存,一级缓存作用域太低了,所以诞生了二级缓存。

  • 基于namespace级别的缓存,一个命名空间对应一个二级缓存。
  • 会话查询一条数据,这个数据就会被放在当前会话的一级缓存中。
  • 当前会话关闭后,这个会话的一级缓存就消失了,但是一级缓存会被保存在二级缓存中。
  • 新的会话查询信息,就可以从二级缓存中获取内容了。
  • 不同的mapper查出来的数据会放在自己对应的缓存中。

缓存开启步骤

  1. config设置中开启全局缓存(见官方文档的XML配置)

    <!--默认是开启的,我们需要做的是,显示开启-->
    <setting name="cacheEnabled" value="ture"/>
    
  2. 开启二级缓存

    <cache
      eviction="FIFO"  //清除策略
      flushInterval="60000"//刷新时间
      size="512"		//最大存储对象
      readOnly="true"/>	//是否只读
    
  3. 测试实现

2.3 自定义缓存

2.3.1 手动自定义

官方给出的样例就是手动实现一个缓存的方案。不过需要你自己继承Cache接口。

public interface Cache{
    String getId();
    void putObject(Object var1,Object var2);
    Object getObject(Object var1);
    Object removeObject(Object var1);
    void clear();
    int getSize();
    default ReadWriteLock getReadWriteLock(){return null;}
}

不过这个别人有写好的基本操作,总共就这么多,我们可以看看:在这里插入图片描述

不过没什么好看的。

说一下手写自定义缓存的步骤吧:

  1. 设置中配置缓存类型(官方样例):
<cache type="com.domain.something.MyCustomCache"/>

也可以实现JavaBean属性。

<cache type="com.domain.something.MyCustomCache">
  <property name="cacheFile" value="/tmp/my-custom-cache.tmp"/>
</cache>
  1. 实现接口。

在sql映射中也可以单独设置基于命名空间层的缓存策略:来显式的设置是否更新缓存等配置。

<select ... flushCache="false" useCache="true"/>
<insert ... flushCache="true"/>
<update ... flushCache="true"/>
<delete ... flushCache="true"/>

2.3.2 自定义缓存-ehcache

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

简单介绍一下使用步骤:

  1. 先导包:去仓库搜一下
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-ehcache -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-ehcache</artifactId>
    <version>1.0.0</version>
</dependency>
  1. 然后配置ehcache的xml,去百度上随便搜点配置就好了。
<!--ehcache.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
 <!-- 磁盘保存路径 -->
 <diskStore path="E:\Mybatis\ehcache" />
 
 <defaultCache 
   maxElementsInMemory="1" 
   maxElementsOnDisk="10000000"
   eternal="false" 
   overflowToDisk="true" 
   timeToIdleSeconds="120"
   timeToLiveSeconds="120" 
   diskExpiryThreadIntervalSeconds="120"
   memoryStoreEvictionPolicy="LRU">
 </defaultCache>
</ehcache>
 
<!-- 
属性说明:
l diskStore:指定数据在磁盘中的存储位置。
l defaultCache:当借助CacheManager.add("demoCache")创建Cache时,EhCache便会采用<defalutCache/>指定的的管理策略
 
以下属性是必须的:
l maxElementsInMemory - 在内存中缓存的element的最大数目 
l maxElementsOnDisk - 在磁盘上缓存的element的最大数目,若是0表示无穷大
l eternal - 设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断
l overflowToDisk - 设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上
 
以下属性是可选的:
l timeToIdleSeconds - 当缓存在EhCache中的数据前后两次访问的时间超过timeToIdleSeconds的属性取值时,这些数据便会删除,默认值是0,也就是可闲置时间无穷大
l timeToLiveSeconds - 缓存element的有效生命期,默认是0.,也就是element存活时间无穷大
 diskSpoolBufferSizeMB 这个参数设置DiskStore(磁盘缓存)的缓存区大小.默认是30MB.每个Cache都应该有自己的一个缓冲区.
l diskPersistent - 在VM重启的时候是否启用磁盘保存EhCache中的数据,默认是false。
l diskExpiryThreadIntervalSeconds - 磁盘缓存的清理线程运行间隔,默认是120秒。每个120s,相应的线程会进行一次EhCache中数据的清理工作
l memoryStoreEvictionPolicy - 当内存缓存达到最大,有新的element加入的时候, 移除缓存中element的策略。默认是LRU(最近最少使用),可选的有LFU(最不常使用)和FIFO(先进先出)
 -->

  1. 设置缓存使用,同时还可以通过JavaBean来修改一些配置。

    <cache type="org.mybatis.caches.ehcache.EhcacheCache">
    <!-- 可以通过JavaBean修改缓存的一些配置 -->
    </cache>
    
    
  2. 项目中使用

其实缓存表面上也就这么多东西,会用的话,没什么难的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值