java面试题网

普通会员

96

帖子

7

回复

176

积分

楼主
发表于 2018-03-29 15:14:12 | 查看: 6322| 回复: 1

MyBatis的一级缓存和二级缓存

Mybatis的一级缓存即Mybatis首先去缓存中查询结果集,如果没有则查询数据库,如果有则从缓存取出返回结果集就不走数据库。Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从查询出来映射生成的java对象

Mybatis的二级缓存即查询缓存,它的作用域是一个mapper的namespace,即在同一个namespace中查询sql可以从缓存中获取数据。二级缓存是可以跨SqlSession的。



文章来自www.wityx.com,转载请注明出处!原文地址http://www.wityx.com/post/243_1_1.html


java面试题交流群:327440556      阿里云产品2000元通用优惠券限时领


普通会员

115

帖子

83

回复

169

积分
沙发
发表于 2019-09-27 11:44:59

Mybatis中一级缓存与二级缓存? 
1. 一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或
close 之后,该Session中的所有 Cache 就将清空。
2. 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为
Mapper(Namespace),并且可自定义存储源,如 Ehcache。作用域为namespance是指对该namespance对
应的配置文件中所有的select操作结果都缓存,这样不同线程之间就可以共用二级缓存。
启动二级缓存:在mapper配置文件中:<cache />。
二级缓存可以设置返回的缓存对象策略:<cache readOnly="true">。当 readOnly="true"时,表示二级缓存返
回给所有调用者同一个缓存对象实例,调用者可以 update 获取的缓存实例,但是这样可能会造成其他调用者出
现数据不一致的情况(因为所有调用者调用的是同一个实例)。当readOnly="false"时,返回给调用者的是二级
缓存总缓存对象的拷贝,即不同调用者获取的是缓存对象不同的实例,这样调用者对各自的缓存对象的修改不会
影响到其他的调用者,即是安全的,所以默认是readOnly="false";
3. 对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了 C/U/D 操作后,
默认该作用域下所有 select 中的缓存将被clear。 

您需要登录后才可以回帖 登录 | 立即注册

java面试题网www.wuliaokankan.cnjava建站系统提供技术支持V2.1 网站地图 © 2016-2018