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