MyBatis3.x整理:(五)缓存机制

目录

一、一级缓存

二、二级缓存 

三、EhCache


MyBatis缓存分两级缓存:

一级缓存(也称为本地缓存),默认已开启

二级缓存(也称为查询缓存),需要手动开启和配置,基于其他的缓存框架技术

 

一、一级缓存

在SqlSession中存在一个Map用于缓存查询出来的对象,可以提升性能。MyBatis把执行的方法和参数通过算法生成缓存的Key,将key和查询的结果value存入一个Map对象中。

注:一级缓存提升性能有限,因为SqlSession生命周期太短(和SqlSession相同),真正需要提升性能我们得使用二级缓存

 

二、二级缓存 

 不是所有的对象都适合放到二级缓存。

通常放入二级缓存的情况:

1)经常查询的数据

2)很少被修改的数据

3)不会被并发访问的数据

 

不适合放在二级缓存的情况:

经常被修改的数据

 

二级缓存有一些性能相关的属性:

1)命中率(总的从二级缓存中取得的数量/总的取的数量)

2)最在对象数

3)最大空闲时间

 

1、基本使用

一级缓存是SqlSession级别的,二级缓存是mapper级别的。

二级缓存是多个 SqlSession共享,作用域是mapper的同一个namespace

1)二级缓存默认是开启的

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

2)Mapper文件中设置二级缓存,使用cache元素

<mapper namespace="com.bigfong.mybatis.cache.mapper.TeacherMapper">
	<cache/>
	
	<select id="get" resultType="Teacher" useCache="true">
		select id,name from teacher where id = #{id}
	</select>
</mapper>

3)存于缓存中的对象必须实现java.io.Serializable接口:

 

2.缓存配置细节

1)映射文件中的所有select都会实用查询缓存

2)大多情况下,对于列表查询的select不缓存,因为只有SQL和查询参数完全相同,才会使用查询缓存(设置useCache="false")

<select id="listAll" resultType="Teacher" useCache="false">
		select id,name from teacher
</select>

3)一般的,只会对get做查询缓存

4)文件中所有的insert、update、delete语句都会刷新缓存,一般针对insert操作不需要刷新缓存(设置flushCache=false")

 

3.常见缓存属性

cache元素的常用属性:blocking,eviction,flushInterval,readOnly,size,type

eviction属性:缓存回收策略

                          [1]LRU 最近最少使用:移除最长时间不被使用的对象(缺省)

                          [2]FIFO 先进选出:按对象进入缓存的顺序来移除它们

                          [3]SOFT 软引用:移除基于垃圾回收器状态和软引用规则的对象

                          [4]WEAK 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象

flushIntverval属性:刷新间隔,单位毫秒,可以设置为任意整数,缺省为没有刷新间隔,缓存仅仅调用语句时刷新

size属性:引用数目,正整数,缺省为1024,代表最多可以缓存多少个对象,太大容易导致内存溢出

realOnly属性:只读,true/false,默认false

                        true:只读缓存;会给所有调用者返回缓存对象的相同实例,因此这些对象不能被修改,这提供了很生要的                                             性能优势

                        false:读写缓存,会返回缓存对象的拷贝(通过序列化),这会慢一些,但安全

 

三、EhCache

 EhCache是一种广泛使用的开源java分布式缓存,具有快速、简单、多种缓存策略、缓存数据内存和硬盘两种级别的特点。缓存数据会在JVM重启的过程中写入硬盘,支持多缓存管理实例以及一个实例的多个缓存区域。

MyBatis中使用EhCache依赖的jar:

ehcache-core-2.6.8.jar

mybatis-ehcache-1.0.3.jar

slf4j-api-1.7.25.jar

slf4j-log4j12-1.7.25.jar

ehcache.xml

<ehcache>
    <diskStore path="java.io.tmpdir"/>


	<!-- 默认的cache配置,相当于是公共的,如果没有设置使用哪一个缓存区域,就使用该默认的区域 -->
    <defaultCache
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="3"
        timeToLiveSeconds="5"
        overflowToDisk="true"
        />

	<!-- 自定义区域的Cache, -->
    <cache name="com.bigfong.mybatis.cache.mapper.TeacherMapper"
        maxElementsInMemory="10000"
        eternal="true"
        timeToIdleSeconds="300"
        timeToLiveSeconds="600"
        overflowToDisk="true"
        />
</ehcache>

共同的属性配置

        1,maxElementsInMemory:该缓存池放在内存中最大的缓存对象个数;
        2,eternal:是否永久有效,如果设置为true,内存中对象永不过期;
        3,timeToIdleSeconds:缓存对象最大空闲时间,单位:秒;
        4,timeToLiveSeconds:缓存对象最大生存时间,单位:秒;
        5,overflowToDisk:当内存中对象超过最大值,是否临时保存到磁盘;
        6,maxElementsOnDisk:能保存到磁盘上最大对象数量;
        7,diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒
        8,memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。
            默认策略是LRU(最近最少使用),可以设置为FIFO(先进先出)或是LFU(较少使用)

Mapper文件中设置查询缓存选用的缓存技术

<mapper namespace="com.bigfong.mybatis.cache.mapper.TeacherMapper">
	<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
	
	<select id="get" resultType="Teacher" useCache="true">
		select id,name from teacher where id = #{id}
	</select>
</mapper>

 

源码下载

上一篇: MyBatis3.x整理:(四)对象关系映射

下一篇: MyBatis3.x整理:(六)MyBatis Generator​​​​​​​

 

分析一下 "XNIO-2 task-52" #599 prio=5 os_prio=0 tid=0x000055eb63293800 nid=0x25d waiting for monitor entry [0x00007f6263877000] java.lang.Thread.State: BLOCKED (on object monitor) at java.lang.Throwable.fillInStackTrace(Native Method) at java.lang.Throwable.fillInStackTrace(Throwable.java:783) - locked <0x00000000eaac4a38> (a java.lang.reflect.InvocationTargetException) at java.lang.Throwable.<init>(Throwable.java:310) at java.lang.Exception.<init>(Exception.java:102) at java.lang.ReflectiveOperationException.<init>(ReflectiveOperationException.java:89) at java.lang.reflect.InvocationTargetException.<init>(InvocationTargetException.java:72) at sun.reflect.GeneratedMethodAccessor134.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:426) at com.sun.proxy.$Proxy91.selectList(Unknown Source) at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:223) at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:173) at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:78) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:148) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) at com.sun.proxy.$Proxy185.selectList(Unknown Source) at sun.reflect.GeneratedMethodAccessor187.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
03-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值