学习笔记之Mybatis的一级缓存和二级缓存

MyBatis缓存机制
本文介绍了MyBatis中的一级缓存与二级缓存的工作原理及配置方法,包括如何手动配置二级缓存、如何关闭特定语句的缓存、以及如何使用分布式缓存解决方案。

需求原因,当进行查询时,执行多次同一语句,则返回结果相同但是每次还是要执行相同的语句,如果将查询的数据存入缓存,下次使用时直接从缓存中调用出来就即可

一级缓存:一级缓存是在sqlSession对象中有一个数据结构(hashmap)用于存储数据,不同sqlSession之间是不影响的。Mybatis默认开启一级缓存。

二级缓存:mapper级别的缓存,当多个sqlSession去操作同一个mapper文件的sql语句时,可以公用mapper的缓存。也是通过hashmap存储(这里相同的mapper,不光指同一个mapper还可以指多个namespace相同的mapper)Mybatis默认不开启二级缓存需要手动配置,方法如下:

1.在核心配置文件sqlMapConfig.xml中加入

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

2.在mapper.xml文件中加入

<cache />

如何关闭某个语句的二级缓存

  <select id="findUserById" parameterType="int" resultType="User"     useCache="false">加入useCache参数并将其设为false

注意使用二级缓存pojo类必须实现序列化接口。,因为二级缓存的存储介质多种多样,不一定在内存

注意:

如果查询结束后,将数据存储到缓存中(无论一级二级缓存),

当出现改变数据库的语句时如update,delete等,则会立马清除缓存中所有内容,防止数据的脏读。当这些语句完成sqlSession.commit()操作时就会去清空缓存

如何不刷新缓存?

在statement语句中

 <select id="findUserById" parameterType="int" resultType="User"     flushCache="false">加入 flushCache="false"属性,默认为ture,会自动刷新,改为false不会自动刷新。


使用分布式缓存:

为什么要使用?

假设现在有两个服务器1和2,用户访问的时候访问了1服务器,查询后的缓存就会放在1服务器上,假设现在有个用户访问的是2服务器,那么他在2服务器上就无法获取刚刚那个缓存,如下图所示:


 为了解决这个问题,就得找一个分布式的缓存,专门用来存储缓存数据的,这样不同的服务器要缓存数据都往它那里存,取缓存数据也从它那里取,如下图所示:


如上图所示,在几个不同的服务器之间,我们使用第三方缓存框架,将缓存都放在这个第三方框架中,然后无论有多少台服务器,我们都能从缓存中获取数据。

这里我们介绍mybatis与第三方框架ehcache的整合。

 

①、导入 mybatis-ehcache 整合包(最上面的源代码中包含有

  

 

   ②、在全局配置文件 mybatis-configuration.xml 开启缓存

1
2
3
4
<!--开启二级缓存  -->
<settings>
    <setting name="cacheEnabled" value="true"/>
</settings>

  

   ③、在 xxxMapper.xml 文件中整合 ehcache 缓存

  将如下的类的全类名写入<cache type="" ></cache>的type属性中

1
2
3
4
5
<!-- 开启本mapper的namespace下的二级缓存
    type:指定cache接口的实现类的类型,不写type属性,mybatis默认使用PerpetualCache
    要和ehcache整合,需要配置type为ehcache实现cache接口的类型
-->
<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>

  

  ④、配置缓存参数

  在 classpath 目录下新建一个 ehcache.xml 文件,并增加如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
 
    <diskStore path="F:\develop\ehcache"/>
 
    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            maxElementsOnDisk="10000000"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap"/>
    </defaultCache>
     
</ehcache>





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值