Mybatis的缓存讲解
前段时间阿粉的一个朋友和阿粉吃饭,在吃饭的时候和阿粉疯狂的吐槽面试官,说面试官问的问题都是些什么问题呀,我一个干了三四年的开发,也不说问点靠谱的,阿粉很好奇,问题问完基础的,一般不都是根据你自己的简历进行提问么?而接下来他说的出来的问题,阿粉表示,阿粉需要继续学习了。
Mybatis是什么?
说到这个,读者大人们肯定心想,阿粉是在开玩笑么?你一个 Java 程序员,你不知道Mybatis是啥么?不就是个持久层的框架么,这东西有啥好说的呢?但是阿粉还是要给大家说。
Mybatis是一个半自动 ORM(对象关系映射)框架,它内部封装了JDBC,加载驱动、创建连接、创建 statement 等繁杂的过程,我们开发的时候只需要关注如何编写 SQL 语句,而不用关心其他的。
为什么说 Mybatis 是一个半自动 ORM 的框架呢?
ORM,是Object和Relation之间的映射,而Mybatis 在查询关联对象或关联集合对象时,需要手动编写 sql 来完成,所以,称之为半自动 ORM 框架,而Hibernate 属于全自动 ORM 映射工具,使用 Hibernate 查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。
这也是为什么有些面试官在面试初级程序员的时候,很喜欢说,你觉得 Mybatis , 和 Hibernate 都有什么优缺点,为啥你们选择使用的 Mybatis 而不选择使用 Hibernate 呢?
我们都说了 Mybatis是什么了,接下来肯定需要说说面试官都问了什么问题,能让阿粉的朋友变得非常犹豫。 Mybatis的一级、二级缓存是什么你了解么?Mybatis 的一级缓存
我们先说 Mybatis 的一级缓存,因为这是如果不手动配置,他是自己默认开启的一级缓存,一级缓存只是相对于同一个 SqlSession 而言,参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper方法,往往只执行一次SQL,因为使用SelSession第一次查询后,MyBatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession都会取出当前缓存的数据,而不会再次发送SQL到数据库。
当我们面试的时候,说完这个,一般情况下,面试官一定会追问下去,毕竟技术就是要问到你的知识盲区才会停止。
那我们就来画个图表示一下一级缓存
那面试官肯定会说,直接从数据库查不就行了,为啥要一级缓存呢?
当我们使用MyBatis开启一次和数据库的会话时, MyBatis 会创建出一个 SqlSession 对象表示一次与数据库之间的信息传递,在我们执行 SQL 语句的过程中,们可能会反复执行完全相同的查询语句,如果不采取一些措施,我们每一次查询都会查询一次数据库,而如果在极短的时间内做了很多次相同的查询操作,那么这些查询返回的结果很可能相同。
也就是说,如果我们在短时间内,频繁的去执行一条 SQL ,查询返回的结果本来应该是改变了,但是我们查询出来的时候,会出现结果一致的情况,正是为了解决这种问题,也为了减轻数据库的开销,所以 Mybatis 默认开启了一级缓存。 Mybatis 的二级缓存
Mybatis 的二级缓存一般如果你不对他进行设置,他是不会开启的,而二级缓存是什么呢?Mybatis 中的二级缓存实际上就是 mapper 级别的缓存,而这时候肯定会有人说,那么不同之间的 Mapper 是同一个缓存么?
答案是否定的,他不是一个,Mapper 级别的缓存实际上就是相同的 Mapper 使用的是一个二级缓存,但是在二级缓存中,又有多个不同的 SqlSession ,而不同的 Mapper 之间的二级缓存也就是互相不会影响的。
就类似下面的图
这二级缓存是不是就看起来有点意思了?
那怎么能够开启二级缓存呢?
1.MyBatis 配置文件
2.MyBatis 要求返回的 POJO 必须是可序列化的
3.Mapper 的 xml 配置文件中加入 标签
既然我们想要了解这个二级缓存,那么必然,我们还得知道它里面的配置都有哪些含义。
我们先从标签看起,然后从源码里面看都有哪些配置信息提供给我们使用:
blocking : 直译就是调度,而在 Mybatis 中,如果缓存中找不到对应的 key ,是否会一直 blocking ,直到有对应的数据进入缓存。
eviction : 缓存回收策略
而缓存回收策略,在源码中是有直接体现的,那么他们分别都对应了什么形式呢? typeAliasRegistry.registerAlias("PERPETUAL", PerpetualCache.class); typeAliasRegistry.registerAlias("FIFO", FifoCache.class); typeAliasRegistry.registerAlias("LRU", LruCache.class); typeAliasRegistry.registerAlias("SOFT", SoftCache.class); typeAliasRegistry.registerAlias("WEAK", WeakCache.class); PERPETUAL : 选择 PERPETUAL 来命名缓存,暗示这是一个最底层的缓存,数据一旦存储进来,永不清除.好像这种缓存不怎么受待见。 FIFO : 先进先出:按对象进入缓存的顺序来移除它们 LRU : 最近最少使用的:移除最长时间不被使用的对象。 SOFT : 软引用:移除基于垃圾回收器状态和软引用规则的对象。 WEAK : 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
大家虽然看着 PERPETUAL 排在了第一位,但是它可不是默认的,在 Mybatis 的缓存策略里面,默认的是 LRU 。
PERPETUAL :
源代码如下: public class PerpetualCache implements Cache { private final String id; private Map
火爆全网的扎心语录因为你不够重要所以他情商不高。后来我才明白很多事情说再多都没有用了,就像你拿着一杯热水,虽然很渴但是很烫还是会放下。你无法安慰一个无比清醒的人她太懂了所有安慰她都在心里反驳两个人的
缺钱,真的好可怕有钱,万事底气足有钱,自信有风采。兜里有钱,生活处处都有爱。走路带风,脸上藏喜,好运可能也会节节开。落魄的时候,父母都是仇人没钱的时候,人最无奈也最心寒。越穷越悲哀,越穷越无奈。钱
关系再好,也不要这样聊天,不然会变成灾难做人做事应把握分寸尺度。即便关系再好,也要懂得适可而止。尤其在聊天这方面,把握分寸,比会冠冕堂皇的奉承更重要。不要过分敷衍和冷漠。人与人之间的交流贵在真诚。你来我往是最起码的尊重,
A股又有消息降临,周一,行情前瞻这一周股市维持向下拓展的整理趋势。由于短线构筑的上涨遭遇抛压盘筑顶,使得三大股指没有脱离下跌隐忧,整体环境倾向加速跳水。欣慰的是沪指下跌的时候吸引资金买进,汇聚的多头能量减少持续杀
今日,再次全面下跌,A股,传递了三个信号早盘,行情分化,指数冲高回落,股票普跌,超过4200只股票下跌,对于这种行情,很多股友又是亏损的一天了。黑色星期四,再次上演,但是行情还是需要去复盘,发现其实只是分化行情,权重股没
今日,股市全面大跌,但是,释放两大信号今日的股市可谓是跌宕起伏,一波三折啊,因为,在早上一开盘的时候,A股三大指数直接就出现了一波跳空低开的行情,同时,也让A股三大指数在早盘的时候纷纷都出现了缺口。但是,这个缺口没有出
明日,单针探底?A股,周五行情分析今日的行情,我不知道如何形容,就是大跌了。不想解释为什么?昨天收盘时,就分享考验3140点的支撑,跌破了,就是加速砸盘了,所以敬畏市场。A股,沪指跌2。26失守3100点,深成指跌
亲爱的小孩离婚夫妇生娃救娃?资深儿童白血病专家没必要,不可取文羊城晚报全媒体记者李丽正在热播的电视剧亲爱的小孩让不少观众感受了一把婚姻和家庭的复杂滋味。最近,剧情又迎来了全新的冲突已经离婚并重组家庭的方一诺和肖路,面临女儿禾禾得了急性淋巴细
奥地利,阿尔卑斯山,新彼得霍夫酒店BaumschlagerEberle在奥地利AlpeFurx滑雪场的山坡上,有一个由BaumschlagerEberle建筑师事务所设计的新彼得霍夫酒店。这个由12个木屋组成的集群取代了原有的酒店,提供了宁静和亲密的
五一不出京,最佳自驾路线自驾轨迹,时间不对总共是用了8小时,行程加游玩。这是一条环线,来回不同道,就像汽车自驾此生必走318,这条路就是摩托爱好者的压弯天堂,今天开车自驾后,发现很适合汽车自驾,有山有水,
推动生态特色食品和文化旅游融合发展,贵州这样做近日,记者从贵州省文化和旅游厅获悉,2021年以来,省文旅厅深入贯彻落实生态特色食品产业发展有关部署,印发贵州美食进景区实施方案,大力推进贵州美食进旅游景区旅游度假区,提高贵州美食