Mybats生命周期&缓存-------(引用)

前言

Mybatis的缓存主要有两种:

  • 系统缓存,也就是我们一级缓存与二级缓存;
  • 自定义的缓存,比如Redis、Enhance等,需要额外的单独配置与实现,具体日后主要学习介绍。

在这里主要记录系统缓存的一些简单概念, 并没有涉及原理。其中会涉及Mybatis的相关配置以及生命周期等。

主要参考资料:《深入浅出Mybatis基础原理与实战》,http://www.mybatis.org/mybatis-3/zh/index.html


1、Mybatis简单配置介绍

本文介绍的是基于XML的配置,并不是关于注解的Mybatis配置。当然复杂SQL情况下都建议使用XML配置。

(1)配置步骤

这里记录的只是Myabtis的简单配置,并没有证整合Spring等框架,所以相对简单。我开始学的时候也是反复记不住,不知道为什么要这么配置,这么配置的作用是什么。之后经过研读《深入浅出Mybatis基础原理与实战》(我这里只有PDF电子版本,有需要的朋友可以评论或者私信我),总结并画图让我对整个配置过程有了全新的认识。

简单来说,Mybatis的配置主要分为以下几步(整合Spring之后有些就不需要了,但是一开始学习不建议直接整合Spring):

  • 编写POJO即JavaBean,最终的目的是将数据库中的查询结果映射到JavaBean上;
  • 配置与POJO对应的Mapper接口:里面有各种方法,对应mapper.xml中的查询语句;
  • 配置与POJO对应的XML映射:编写缓存,SQL查询等;
  • 配置mybatis-config.xml主要的Mybatis配置文件:配置数据源、扫描mapper.xml等。

注意:以上的配置并没有严格的前后顺序;

(2)配置流程图

image

(3)配置总结

可以这么总结Mybatis或者帮助理解Mybatis的配置,我总结了以下三点提供参考:

  • 一切Mybatis配置都是为了创建SqlSession进行SQL查询;
  • 归根结底程序代码中我们屏蔽了各种配置映射,只显式调用使用Mapper接口,那么接口实现类的获得是通过SqlSession.getMapper()获得;
  • 那么mapper接口实现类的获得是通过mybatis-config.xml->SqlSessionFactoryBuilder->SqlSessionFacotry->SqlSession->mapper;

2、Mybatis生命周期

正确理解SqlSessionFactory、SqlSessionFactoryBuilder、SqlSession和Mapper的生命周期对于优化Mybatis尤为重要,这样可以使Mybatis高效正确完成;同为重要时Mybatis的生命周期对于理解Myabtis缓存的配置也尤为重要,我这里只做简单的文字介绍(其实也好理解):

(1)SqlSessionFactoryBuilder:作用就是创建一个构建器,一旦创建了SqlSessionFactory,它的任务就算完成了,可以回收。

  (2)SqlSessionFactory:作用是创建SqlSession,而SqlSession相当于JDBC的一个Connection对象,每次应用程序需要访问数据库,我们就要通过SqlSessionFactory创建一个SqlSession,所以SqlSessionFactory在整Mybatis整个生命周期中(每个数据库对应一个SqlSessionFactory,是单例产生的)。

  (3)SqlSession:生命周期是存在于请求数据库处理事务的过程中,是一个线程不安全的对象(在多线程的情况下,需要特别注意),即存活于一个应用的请求和申请,可以执行多条SQL保证事务的一致性。

  (4)Mapper:是一个接口,并没有实现类它的作用是发送SQL,返回我们需要的结果,或者发送SQL修改数据库表,所以它存活于一个SqlSession内,是一个方法级别的东西。当SqlSession销毁的时候,Mapper也会销毁。

3、Myabtis缓存介绍

(1)系统缓存:包括一级缓存与二级缓存

  一级缓存:默认情况下Myabtis对于同一个SqlSession开启一级缓存    

  • 在默认没有配置的情况下,只会开启一级缓存(只针对同一个SqlSession而言);
  • 在参数与SQL完全一样的情况下并且不声明刷新缓存没超时的,使用同一个SqlSession对象调用同一个Mapper方法时(SqlSession对象生命周期为方法级别),SqlSession只会取出当前缓存数据,不会再到数据库中进行查询;
  • 如果不同的SqlSession,即使同一个Mapper也会进行到数据库中进行不同的查询,即不同的SqlSession一级缓存是无效的。

  二级缓存:这里可以结合SqlSessionFactory等的生命周期能加深理解

  • 不同的SqlSession是隔离的,为了解决这个问题,我们可以在SqlSessionFactory层面上设置二级缓存提供各个对象SqlSession
  • 二级缓存默认是不开启的,需要进行配置,Mybatis要求返回的POJO必须是可序列化的,即POJO实现Serializable接口。

缓存的配置只需要在XML配置<cache/>即可,或者指定算法,刷新时间间隔,缓存状态,大小等

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"> <cache eviction="LRU" readOnly="true" flushInterval="100000" size="1024"></cache></pre>

A. 映射语句文件中所有select语句将会被缓存;

B. 映射语句文件中所有insert、update和delete语句会被刷新缓存;

C. 缓存使用默认的LRU最近最少使用算法回收;

D. 根据时间表,缓存不会任何时间顺序刷新;

E. 缓存会存储列表集合或对象的1024个引用

F. 缓存被视为可read/write的缓存,意味着是不可以被共享的,而可以被安全地修改。

  (2)自定义缓存:结合Redis等主流缓存配置

我们可以使用比如现在比较火的Redis缓存,需要实现Myabtis为我们提供的接口org.apache.ibatis.cache.Cache。虽然现在主流Mybatis用的都是自定义缓存,但是这里先不过多介绍,我一步一步来学习记录!

总结与补充

(1)作为新手很大可能在配置过程中会遇到很多坑(我就是其中之一),比如Mybatis的日志配置。这里可以主要参考:http://www.mybatis.org/mybatis-3/zh/configuration.html

  (2)mybatis的相关配置文件(没有myabtis-config.xml)可以使用eclipse中的插件生成(具体网上有很多教程),但还要进行适当修改!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容