范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

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 cache = new HashMap<>();   public PerpetualCache(String id) {     this.id = id;   }
  恩?看着是不是有点眼熟,它怎么就只是包装了 HashMap ? 你还别奇怪,他还真的就是使用的 HashMap ,不得不说,虽然人家是使用的 HashMap ,但是那可是比咱们写的高端多了。
  既然使用 HashMap ,那么必然就会有Key,那么他们的Key是怎么设计的?
  CacheKey:  public class CacheKey implements Cloneable, Serializable {   private static final long serialVersionUID = 1146682552656046210L;   public static final CacheKey NULL_CACHE_KEY = new NullCacheKey();   private static final int DEFAULT_MULTIPLYER = 37;   private static final int DEFAULT_HASHCODE = 17;   private final int multiplier;   private int hashcode; //用于表示CacheKey的哈希码   private long checksum; //总和校验,当出现复合key的时候,分布计算每个key的哈希码,然后求总和   private int count;//当出现复合key的时候,计算key的总个数   // 8/21/2017 - Sonarlint flags this as needing to be marked transient.  While true if content is not serializable, this is not always true and thus should not be marked transient.   private List updateList;//当出现复合key的时候,保存每个key
  确实牛逼,至于内部如何初始化,如何进行操作,大家有兴趣的可以去阅读一下源码,导入个源码包,打开自己看一下。
  FIFO : 先进先出缓冲淘汰策略 public class FifoCache implements Cache {    private final Cache delegate; //被装饰的Cache对象   private final Deque keyList;//用于记录key 进入缓存的先后顺序   private int size;//记录了缓存页的上限,超过该值需要清理缓存(FIFO)    public FifoCache(Cache delegate) {     this.delegate = delegate;     this.keyList = new LinkedList<>();     this.size = 1024;   }
  在 FIFO 淘汰策略中使用了 Java 中的 Deque,而 Deque 一种常用的数据结构,可以将队列看做是一种特殊的线性表,该结构遵循的先进先出原则。Java中,LinkedList实现了Queue接口,因为LinkedList进行插入、删除操作效率较高。
  当你看完这个源码的时候,是不是就感觉源码其实也没有那么难看懂,里面都是我们已经掌握好的知识,只不过中间做了一些操作,进行了一些封装。
  LRU  : 最近最少使用的缓存策略
  而 LUR 算法,阿粉之前都说过,如果对这个算法感兴趣的话,文章地址给大家送上,经典的 LRU 算法,你真的了解吗?
  而我们需要看的源码则是在 Mybatis 中的源码,  public class LruCache implements Cache {    private final Cache delegate;   private Map keyMap;   private Object eldestKey;//记录最少被使用的缓存项key    public LruCache(Cache delegate) {     this.delegate = delegate;     setSize(1024);//重新设置缓存的大小,会重置KeyMap 字段 如果到达上限 则更新eldestKey   }     public void putObject(Object key, Object value) {       delegate.putObject(key, value);       // 删除最近未使用的key       cycleKeyList(key);     }
  SOFT : 基于垃圾回收器状态和软引用规则的对象
  在看到基于垃圾回收器的时候,阿粉就已经开始兴奋了,竟然有GC的事情,那还不赶紧看看,这如此高大上(装杯)的事情,来瞅瞅吧!  public class SoftCache implements Cache {   //在SoftCache 中,最近使用的一部分缓存项不会被GC回收,这就是通过将其value添加到   private final Deque hardLinksToAvoidGarbageCollection;   //引用队列,用于记录GC回收的缓存项所对应的SoftEntry对象   private final ReferenceQueue queueOfGarbageCollectedEntries;   //底层被修饰的Cache 对象   private final Cache delegate;   //连接的个数,默认是256   private int numberOfHardLinks;    public SoftCache(Cache delegate) {     this.delegate = delegate;     this.numberOfHardLinks = 256;     this.hardLinksToAvoidGarbageCollection = new LinkedList<>();     this.queueOfGarbageCollectedEntries = new ReferenceQueue<>();   }      public void putObject(Object key, Object value) {       // 清除被GC回收的缓存项       removeGarbageCollectedItems();       // 向缓存中添加缓存项       delegate.putObject(key, new SoftEntry(key, value, queueOfGarbageCollectedEntries));     }    public Object getObject(Object key) {        Object result = null;        // 查找对应的缓存项        @SuppressWarnings("unchecked") // assumed delegate cache is totally managed by this cache        SoftReference softReference = (SoftReference) delegate.getObject(key);        if (softReference != null) {          result = softReference.get();          // 已经被GC 回收          if (result == null) {            // 从缓存中清除对应的缓存项            delegate.removeObject(key);          } else {            // See #586 (and #335) modifications need more than a read lock             synchronized (hardLinksToAvoidGarbageCollection) {              hardLinksToAvoidGarbageCollection.addFirst(result);              if (hardLinksToAvoidGarbageCollection.size() > numberOfHardLinks) {                hardLinksToAvoidGarbageCollection.removeLast();              }            }          }        }        return result;      }     public void clear() {         synchronized (hardLinksToAvoidGarbageCollection) {           // 清理强引用集合           hardLinksToAvoidGarbageCollection.clear();         }         // 清理被GC回收的缓存项         removeGarbageCollectedItems();         delegate.clear();       }     //其中指向key的引用是强引用,而指向value的引用是弱引用     private static class SoftEntry extends SoftReference {       private final Object key;          SoftEntry(Object key, Object value, ReferenceQueue garbageCollectionQueue) {         super(value, garbageCollectionQueue);         this.key = key;       }     }
  WEAK  : 基于垃圾收集器状态和弱引用规则的对象 public class WeakCache implements Cache {   private final Deque hardLinksToAvoidGarbageCollection;   private final ReferenceQueue queueOfGarbageCollectedEntries;   private final Cache delegate;   private int numberOfHardLinks;    public WeakCache(Cache delegate) {     this.delegate = delegate;     this.numberOfHardLinks = 256;     this.hardLinksToAvoidGarbageCollection = new LinkedList<>();     this.queueOfGarbageCollectedEntries = new ReferenceQueue<>();   }
  WeakCache在实现上与SoftCache几乎相同,只是把引用对象由SoftReference软引用换成了WeakReference弱引用。
  在这里阿粉也就不再多说了,关于 Mybatis 的二级缓存,你了解了么?下次遇到面试官问这个的时候,你应该知道怎么成功(装杯)不被打了吧。
中汽协或上调今年新能源车销量预期至650万辆许海东中国供应链能力成就了特斯拉每经记者李星每经编辑裴健如到目前为止,我国新能源汽车总体依然保持高增长态势,预计今年全年我国新能源汽车销量将突破650万辆。11月3日,中国汽车工程协会副总工程师许海东在中国汽车健即时零售成新趋势,激活小店经济仍需警惕跑马圈地从深受年轻人喜爱的奶茶到新上市的智能手机,如今,手机下单门店发货商品小时达的即时零售,正成为消费新常态。越来越多的企业也在积极布局这个庞大的即时消费市场。新华每日电讯记者采访发现,光子芯片能否帮助我国弯道超车?首先我们先看下光子芯片到底是什么?它能代替电子芯片吗?1。光子芯片到底是什么?研究人员将磷化铟的发光属性和硅的光路由能力整合到单一混合芯片中。当给磷化铟施加电压的时候,光进入硅片的大家出门都带什么?我每天必带的9件物品又到了喜闻乐见的翻包时刻,不知道大家喜不喜欢看翻包类的文章,我个人是蛮喜欢的,可以看到大家平时最常用的物件有哪些,可以参考参考,自己也可以买。我自己一年里也会写个一两篇翻包的文章,10月安卓手机好评榜,第一大幅度领先,mate50Pro仅排第七头条创作挑战赛一直以来大家在选择手机时最在乎的应该就是手机的评价了,一款手机评价越多,其中好评占比更高的话,足以说明这款手机买的人多,认可度高,也因此销量就会更好。而根据十月份安兔中立场!同城兄弟被武汉三镇重击,严鼎皓与广州队教练击掌回归又出现了机会?随着广州城队1比4被武汉三镇重击,同城兄弟广州队又出现了超越对手的希望。吉列尔梅任意球直接破门为广州城队扳平了比分,本以为再一次是武汉三镇翻车的比赛,却以正常的结果结奥运冠军陈玘二婚娶小11岁娇妻儿女双全,赛场杀神如今成女儿奴国乒可以说是一支无敌之师,从九十年代开始,这支队伍就开始长期屹立在世界乒坛的最高峰,长盛不衰。从这里走出来的世界冠军数不胜数,用刘国梁当年的话说这里最不缺的就是世界冠军。不过即使是贫嘴侃爷的幸福生活壹1994年6月,美国发生了一起轰动全国的辛普森杀妻案。6月12日晚上十点,黑人橄榄球超级巨星辛普森的前妻妮可,被人在洛杉矶家中割喉,来给妮可送东西的24岁白人小帅哥男友戈德曼,也恭喜!广东队三冠功臣加入中国男篮,担任体能教练,再次辅佐杜锋中国男篮教练组正式确定中国男篮新一批17人大名单公布之后,引起了不少球迷的争议,很多球迷认为杜锋任人唯亲,一些表现出色的本土球员没能入选国家队。包括陶汉林姜宇星林葳和张宁等球员,反白手起家都是真的吗?看看富豪们的家庭背景你就知道了随着互联网的普及,我们这些普通人也可以随时看到成功的企业家们在各地的讲座或者是访谈节目,甚至一些成功企业家们还会在网络上开直播去分享自己的创业历程,在他们的口中总会强调一个理论王侯AirJordan1HighampampquotLostampampampFoundampampquot除了一系列新配色之外,2022年还迎来了许多OG回归。尽管AirJordan3FireRed和AirJordan2Chicago是最受期待的,但两者都无法真正与预计将于今年10月回
火爆全网的扎心语录因为你不够重要所以他情商不高。后来我才明白很多事情说再多都没有用了,就像你拿着一杯热水,虽然很渴但是很烫还是会放下。你无法安慰一个无比清醒的人她太懂了所有安慰她都在心里反驳两个人的缺钱,真的好可怕有钱,万事底气足有钱,自信有风采。兜里有钱,生活处处都有爱。走路带风,脸上藏喜,好运可能也会节节开。落魄的时候,父母都是仇人没钱的时候,人最无奈也最心寒。越穷越悲哀,越穷越无奈。钱关系再好,也不要这样聊天,不然会变成灾难做人做事应把握分寸尺度。即便关系再好,也要懂得适可而止。尤其在聊天这方面,把握分寸,比会冠冕堂皇的奉承更重要。不要过分敷衍和冷漠。人与人之间的交流贵在真诚。你来我往是最起码的尊重,A股又有消息降临,周一,行情前瞻这一周股市维持向下拓展的整理趋势。由于短线构筑的上涨遭遇抛压盘筑顶,使得三大股指没有脱离下跌隐忧,整体环境倾向加速跳水。欣慰的是沪指下跌的时候吸引资金买进,汇聚的多头能量减少持续杀今日,再次全面下跌,A股,传递了三个信号早盘,行情分化,指数冲高回落,股票普跌,超过4200只股票下跌,对于这种行情,很多股友又是亏损的一天了。黑色星期四,再次上演,但是行情还是需要去复盘,发现其实只是分化行情,权重股没今日,股市全面大跌,但是,释放两大信号今日的股市可谓是跌宕起伏,一波三折啊,因为,在早上一开盘的时候,A股三大指数直接就出现了一波跳空低开的行情,同时,也让A股三大指数在早盘的时候纷纷都出现了缺口。但是,这个缺口没有出明日,单针探底?A股,周五行情分析今日的行情,我不知道如何形容,就是大跌了。不想解释为什么?昨天收盘时,就分享考验3140点的支撑,跌破了,就是加速砸盘了,所以敬畏市场。A股,沪指跌2。26失守3100点,深成指跌亲爱的小孩离婚夫妇生娃救娃?资深儿童白血病专家没必要,不可取文羊城晚报全媒体记者李丽正在热播的电视剧亲爱的小孩让不少观众感受了一把婚姻和家庭的复杂滋味。最近,剧情又迎来了全新的冲突已经离婚并重组家庭的方一诺和肖路,面临女儿禾禾得了急性淋巴细奥地利,阿尔卑斯山,新彼得霍夫酒店BaumschlagerEberle在奥地利AlpeFurx滑雪场的山坡上,有一个由BaumschlagerEberle建筑师事务所设计的新彼得霍夫酒店。这个由12个木屋组成的集群取代了原有的酒店,提供了宁静和亲密的五一不出京,最佳自驾路线自驾轨迹,时间不对总共是用了8小时,行程加游玩。这是一条环线,来回不同道,就像汽车自驾此生必走318,这条路就是摩托爱好者的压弯天堂,今天开车自驾后,发现很适合汽车自驾,有山有水,推动生态特色食品和文化旅游融合发展,贵州这样做近日,记者从贵州省文化和旅游厅获悉,2021年以来,省文旅厅深入贯彻落实生态特色食品产业发展有关部署,印发贵州美食进景区实施方案,大力推进贵州美食进旅游景区旅游度假区,提高贵州美食