mybatis-210722-01---缓存

mybatis-210722-01—缓存


mybatis缓存机制

MyBatis系统中默认定义了两级缓存。  
	一级缓存和二级缓存。 
	1、默认情况下,只有一级缓存(SqlSession级别的缓存,也称为本地缓存)开启。
	2、二级缓存需要手动开启和配置,他是基于namespace级别的缓存。
	3、为了提高扩展性。MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存

一级缓存

一级缓存(本地缓存):
	sqlSession级别的缓存;
	一级缓存是一直开启的;
	相当于SQLSession中级别中的一个map
	
	与数据库同一次会话期间查询到的数据会放在本地缓存中,
	以后如果需要获取相同的数据,直接冲缓存中拿,没必要再去查询数据库
	
	一级缓存失效情况(没有使用到当前一级缓存的情况,还需要再向数据库发出查询)
		1)sqlSession不同
		2)sqlSession相同,查询条件不同(当前一级缓存中还没有这个数据)
		3)sqlSession相同,两次查询之间执行了 增删改 操作(因为这个“增删改”操作,可能对当前数据有影响)
		4)sqlSession相同,手动清除了一级缓存

二级缓存

二级缓存(全局缓存):
	基于namespace级别的缓存,一个namespace对应着一个二级缓存
	
	工作机制:
		1)一个会话,查询一条数据,这个数据就会被放在当前会话的一级缓存中。
		2)如果会话关闭,一级缓存中的数据会被保存到二级缓存中;
		   新的会话去查询信息,就可以参照二级缓存中的查。
		3)不同的namespace查出的数据会放到自己对应的缓存中(map)
工作步骤:
		1)开启全局二级缓存配置
			<setting name="cacheEnabled" value="true"/>
			
		2)去每个 mapper.xml中配置使用的二级缓存
			<mapper namespace="com.bgy.mybatis.dao.EmployeeMapper">
                <!--
                    eviction:
                        缓存的回收策略
                            LRU – 最近最少使用的:移除最长时间不被使用的对象。
                            FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
                            SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
                            WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
                            默认的是 LRU。

                    flushInterval:
                        缓存刷新间隔,
                        缓存多久清空一次,默认是不清空,设置毫秒值

                    readOnly:
                        缓存是否只读,默认是 == 非只读
                        true:只读
                            mybatis认为所有从缓存中获取数据的操作都是只读操作,不会修改数据。
                            mybatis为了加快获取速度,直接就会将数据在缓存中的引用交给用户。
                            不安全,速度快。
                        false:非只读
                            mybatis认为获取的数据可能会被修改,
                            mybatis会利用序列化和反序列化技术,克隆一份新的数据给你。
                            安全,速度慢
                    size:
                        缓存存放多少个元素

                    type:
                        指定自定义缓存的全类名,
                        实现Cache接口即可使用
                -->
                <cache eviction="" flushInterval="" readOnly="" size="" type=""></cache>
           </mapper>
           
		3)POJO需要实现序列化接口
缓存相关的设置/配置:
	1)全局配置环境中
		<setting name="cacheEnabled" value="true"/>
			true:开启缓存机制
			false:关闭缓存机制(二级缓存关闭,一级缓存一直开启)
			
	2)每个mapper.xml中select标签都有useCache="true":
		true:使用缓存
		false:不使用缓存(二级缓存不使用,一级缓存依旧使用)
	
    3)每个mapper.xml中增删改标签都有,flushCache="true"
    	增删改执行完后就会清除缓存,
    	一级缓存,二级缓存都会被清空。
    	
    	查询标签:flushCache默认为false
    			如果为true,当查询之后就会清空一级,二级缓存。
    
    4)sqlSession.clearCache();	只会清除当前session的一级缓存
    
    5)localCacheScope:
    	本地缓存作用域
    	SESSION:当前会话的所有数据保存在会话缓存中
    	STATEMENT:可以禁用一级缓存
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值