文章目录
前言
做过web开发的都知道 , 浏览器缓存是个让人头大的问题 , 开发过程中需要频繁清空缓存 , 然而对于mybatis框架来说 , 缓存却是可用提高效率的工具
一、哪里会用到缓存?
对于一些需要频繁查询 , 但是内容雷同的内容 , 为了节约资源 , MyBatis会把它存入缓存中 , 例如菜单 , 和"我的" 内容
当然在mybatis中 , 缓存也是分级别的 .
一级缓存 : sqlSession级别 , 存在于与数据库的一次对话
二级缓存 : namespace级别的全局缓存 , 每个namespace都会有一个二级缓存 , 如果一级缓存被关闭了 , 内容就会转进二级缓存
mybatis的缓存底层都是map类型 , 这就为下面的使用第三方缓存埋下伏笔
二、通过日志查看一级缓存的工作
1.搭建环境并写好查询语句
2.查询两个相同的内容
3.运行并查看控制台日志
4.结论
这里我们查询了两次100002的ID , 在控制台我们能发现 , 只执行了一次SQL查询. 但是在输出查询结果的时候 , 输出的是两条结果.
这说明 , 我们的mybatis查询了两次, 但是只有一次是在数据库了做的查询 , 另外的一次相同的查询是在一级缓存中查询的.
二. 二级缓存
1.显式地开启二级缓存
注意 : 1.在显式开启二级缓存的时候 , 我们需要把settings标签放在mybatis配置文件的最上面(configuration中)
2.虽然我们默认是开启二级缓存的 , 但是为了防止因为版本更替造成的修改 , 我们应该遵循显式开启原则
3.如果关闭了二级缓存 , 但是并不会关闭一级缓存
<settings>
<setting name="cacheEnable" value="true"/>
</settings>
2.二级缓存的策略
讲一下useCache,flushCache
1.useCache : 是否使用二级缓存
2.flushCache : 在增删改执行完成后 , 刷新缓存 ,默认为false , 如果打开 , 在查询两个相同记录时 , 会查两次
3.缓存顺序
在使用过程中 , mybatis会先查看二级缓存 , 再查看一级缓存 , 如果都没有 , 最后才回去数据库查
三. 整合ehcache缓存
上面说了 , mybatis使用的时map存储缓存, 并不是专业的缓存机制 , 因此,mybatis留下了标准化接口给其它专业的缓存使用 , 如ehcache
操作顺序如下图 :
GitHub搜mybatis-ehcache
下载完成后 , 在工程中的lib包需要以下内容 :
---------------------------------------------分割线-----------------------------------
接下来都是在IDE中进行的操作
1.在mapper.xml文件中 , 我们需要打上这么一个标签 , 指明使用的缓存
<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>
2.创建ehcache.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../config/ehcache.xsd" updateCheck="false">
<!-- 磁盘保存路径 -->
<diskStore path="自己选一个磁盘建文件夹" />
<defaultCache
maxElementsInMemory="100"
maxElementsOnDisk="10000000"
eternal="false"
overflowToDisk="true"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
</defaultCache>
</ehcache>
3.在其它.xml文件中 , 我们并不需要再去重新写缓存 , 而是使用cache-ref
标签引入命名空间实现共享缓存