动用MyBatis缓存

(1).为什么需要采取缓存::

  MyBatis是一个持久层(数据库层)映射框架,在颇具访问数据库的操作着,无疑数据查询是最好耗费数据库资源的操作了,因为你一样糟糕或用查询成千上百万漫漫记下(如果您切莫加以限制),所以当你针对数据库的实时性要求无强之状下,可以拿第一不成实施查询的操作的结果存放于该地缓存中,当您于缺少日外实行同一查询时,就足以直接从当地缓存加载而无用去数据库查询,即加强了速度,又落了数据库的压力。

(2)如下图,是mybatis一级缓存和二级缓存的区分图解:

图片 1

Mybatis一级缓存的作用域是同一个SqlSession,在同一个sqlSession中点滴糟糕实施同样的sql语句,第一涂鸦实践了会将数据库中查询的数量形容到缓存(内存),第二不成见面打缓存中获取数据将不再从数据库查询,从而提高查询效率。当一个sqlSession结束后该sqlSession中的一级缓存也不怕非存在了。Mybatis默认开启一级缓存。

Mybatis二级缓存是大半个SqlSession共享的,其发用域是mapper的与一个namespace,不同之sqlSession两不良实施同一namespace下的sql语句都为sql中传送参数为如出一辙便最终实施同样的sql语句,第一蹩脚施行了会用数据库中查询的数目形容到缓存(内存),第二次等会晤打缓存中获取数据将不再从数据库查询,从而提高查询效率。Mybatis默认没有被二级缓存需要在setting全局参数中配备开启二级缓存。

Mybatis每次查询会先从缓存区域搜索,如果找不顶起数据库查询,查询及多少将数据勾勒副缓存。

Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从询问出来映射生成的java对象,sqlSession执行insert、update、delete等操作commit提交后会见清空缓存区域。

(3)如何行使MyBatis缓存

第一步:引进缓存的仗包

图片 2

 第二步:引进缓存配置文件

classpath下添加:ehcache.xml(src文件的同级文件,即原放置MyBatis-config.xml同个职务)

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
    <diskStore path="F:\develop\ehcache" />
    <defaultCache 
        maxElementsInMemory="1000" 
        maxElementsOnDisk="10000000"
        eternal="false" 
        overflowToDisk="false" 
        timeToIdleSeconds="120"
        timeToLiveSeconds="120" 
        diskExpiryThreadIntervalSeconds="120"
        memoryStoreEvictionPolicy="LRU">
    </defaultCache>
</ehcache> 

特性说明:


diskStore:指定数量以磁盘中之贮存位置。


defaultCache:当负CacheManager.add(“demoCache”)创建Cache时,EhCache便会采用<defalutCache/>指定的底管理策略

盖下属性是须的:

 maxElementsInMemory –
于内存中缓存的element的极端老数量

 maxElementsOnDisk –
在磁盘上缓存的element的卓绝酷数额,若是0表示无穷大

 eternal –
设定缓存的elements是否永久不超时。如果也true,则缓存的多寡始终有效,如果也false那么还要依据timeToIdleSeconds,timeToLiveSeconds判断

 overflowToDisk –
设定当内存缓存溢起底下是不是拿过期的element缓存到磁盘上

因下属性是可选的:

 timeToIdleSeconds –
当缓存在EhCache中的多寡前后两次访的流年过timeToIdleSeconds的性取值时,这些数量就是会删除,默认值是0,也就算是不过按时间无穷大

 timeToLiveSeconds –
缓存element的中生命期,默认是0.,也不怕是element存活时间无穷大

       diskSpoolBufferSizeMB
这个参数设置DiskStore(磁盘缓存)的复苏存区大小.默认是30MB.每个Cache都该发生协调的一个缓冲区.

 diskPersistent –
于VM重开的当儿是不是启用磁盘保存EhCache中之数码,默认是false。

 diskExpiryThreadIntervalSeconds –
磁盘缓存的清理线程运行间隔,默认是120秒。每个120s,相应的线程会进行相同差EhCache中数量的清理工作

 memoryStoreEvictionPolicy –
当内存缓存达到极致深,有新的element加入的时光,
移除了缓存中element的国策。默认是LRU(最近起码使用),可选的生LFU(最不经常使用)和FIFO(先进先出)

第三步:开启ehcache缓存

EhcacheCache是ehcache对Cache接口的贯彻:

图片 3

修改mapper.xml文件,在cache中指定EhcacheCache。<mapper>标签内

<cache />

或(开启ehcache缓存)

<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

还是(根据需要调剂缓存参数)

<cache type="org.mybatis.caches.ehcache.EhcacheCache" > 
        <property name="timeToIdleSeconds" value="3600"/>
        <property name="timeToLiveSeconds" value="3600"/>
        <!-- 同ehcache参数maxElementsInMemory -->
        <property name="maxEntriesLocalHeap" value="1000"/>
        <!-- 同ehcache参数maxElementsOnDisk -->
        <property name="maxEntriesLocalDisk" value="10000000"/>
        <property name="memoryStoreEvictionPolicy" value="LRU"/>
    </cache>

这般设置就安排好MyBatis的缓存环境了。

当您少日外使用和一个session
执行同样的SQL语句,并且极吧同样时,它就会见去缓存内取数据了

(4)如何使二级缓存

前面说罢了二级缓存是对承诺总体Mapper的,但它们默认是关的,那我们怎么动它吗?

率先步:在主导配置文件mybatis-config.xml中参加

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

图片 4

以公的Mapper映射文件被补充加一行:  <cache /> ,表示这mapper开启二级缓存。

(5)实现序列化

二级缓存需要查询结果映射的pojo对象实现java.io.Serializable接口实现序列化和倒序列化操作,注意要有父类、成员pojo都用贯彻序列化接口。

(即实体类继承如下接口)

  public class Order implements Serializable

  public class User implements Serializable

 

(6)禁用二级缓存

 

每当statement中安useCache=false可以禁用当前select语句的二级缓存,即每次查询都见面生出sql去询问,默认情况是true,即该sql使用二级缓存。

 

假若某个修SQL语句实时性要求无思叫其以缓存,只需要以该sql标签内添加usecache=”false”即可;如下所示

 

<select id="findOrderListResultMap" resultMap="ordersUserMap" useCache="false">

 

 

 

(7)禁用刷新缓存

 

在mapper的和一个namespace中,如果起其它insert、update、delete操作数据后用刷新缓存,如果无履刷新缓存会出现脏读。

装statement配置中的flushCache=”true” 属性,默认情况下啊true即刷新缓存,如果更改成为false则免会见刷新。使用缓存时要手动修改数据库表中的询问数据会并发脏读。

 

如下:

<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User" flushCache="true">

 

网站地图xml地图