需求原因,当进行查询时,执行多次同一语句,则返回结果相同但是每次还是要执行相同的语句,如果将查询的数据存入缓存,下次使用时直接从缓存中调用出来就即可
一级缓存:一级缓存是在sqlSession对象中有一个数据结构(hashmap)用于存储数据,不同sqlSession之间是不影响的。Mybatis默认开启一级缓存。
二级缓存:mapper级别的缓存,当多个sqlSession去操作同一个mapper文件的sql语句时,可以公用mapper的缓存。也是通过hashmap存储(这里相同的mapper,不光指同一个mapper还可以指多个namespace相同的mapper)Mybatis默认不开启二级缓存需要手动配置,方法如下:
<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> |