MyBatis相關(guān)的生命周期

參考

MyBatis官方中文文檔

MyBatis官方寫的各種語(yǔ)言的文檔古戴,重點(diǎn)資料。


1. 對(duì)于SqlSessionFactoryBuilder矩肩、SqlSessionFactory和SqlSession的作用域(Scope)和生命周期

1.1 使用依賴注入框架(如spring)

依賴注入框架可以創(chuàng)建線程安全的现恼、基于事務(wù)的 SqlSession 和映射器(mapper)并將它們直接注入到你的 bean 中,因此可以直接忽略它們的生命周期黍檩。

總結(jié):使用spring等依賴注入框架叉袍,自己不用去管其生命周期

1.2 SqlSessionFactoryBuilder

這個(gè)類可以被實(shí)例化刽酱、使用和丟棄喳逛,一旦創(chuàng)建了 SqlSessionFactory,就不再需要它了棵里。因此 SqlSessionFactoryBuilder 實(shí)例的最佳作用域是方法作用域(也就是局部方法變量)润文。你可以重用 SqlSessionFactoryBuilder 來創(chuàng)建多個(gè) SqlSessionFactory 實(shí)例,但是最好還是不要讓其一直存在以保證所有的 XML 解析資源開放給更重要的事情殿怜。

總結(jié):SqlSessionFactoryBuilder典蝌,方法作用域,用完即丟棄头谜。

1.3 SqlSessionFactory

SqlSessionFactory 一旦被創(chuàng)建就應(yīng)該在應(yīng)用的運(yùn)行期間一直存在赠法,沒有任何理由對(duì)它進(jìn)行清除或重建。使用 SqlSessionFactory 的最佳實(shí)踐是在應(yīng)用運(yùn)行期間不要重復(fù)創(chuàng)建多次,多次重建 SqlSessionFactory 被視為一種代碼“壞味道(bad smell)”砖织。因此 SqlSessionFactory 的最佳作用域是應(yīng)用作用域款侵。有很多方法可以做到,最簡(jiǎn)單的就是使用單例模式或者靜態(tài)單例模式侧纯。

總結(jié):SqlSessionFactory新锈,應(yīng)用作用域,全局只要一個(gè)眶熬,使用單例模式妹笆。

1.4 SqlSession

每個(gè)線程都應(yīng)該有它自己的 SqlSession 實(shí)例。SqlSession 的實(shí)例不是線程安全的娜氏,因此是不能被共享的拳缠,所以它的最佳的作用域是請(qǐng)求或方法作用域絕對(duì)不能將 SqlSession 實(shí)例的引用放在一個(gè)類的靜態(tài)域贸弥,甚至一個(gè)類的實(shí)例變量也不行窟坐。也絕不能將 SqlSession 實(shí)例的引用放在任何類型的管理作用域中,比如 Servlet 架構(gòu)中的 HttpSession绵疲。如果你現(xiàn)在正在使用一種 Web 框架哲鸳,要考慮 SqlSession 放在一個(gè)和 HTTP 請(qǐng)求對(duì)象相似的作用域中。換句話說盔憨,每次收到的 HTTP 請(qǐng)求徙菠,就可以打開一個(gè) SqlSession,返回一個(gè)響應(yīng)郁岩,就關(guān)閉它婿奔。這個(gè)關(guān)閉操作是很重要的,你應(yīng)該把這個(gè)關(guān)閉操作放到 finally 塊中以確保每次都能執(zhí)行關(guān)閉问慎。

下面的示例就是一個(gè)確保 SqlSession 關(guān)閉的標(biāo)準(zhǔn)模式:

SqlSession session = sqlSessionFactory.openSession();
try {
  // do work
} finally {
  session.close();
}

在你的所有的代碼中一致性地使用這種模式來保證所有數(shù)據(jù)庫(kù)資源都能被正確地關(guān)閉萍摊。

總結(jié):

  1. SqlSession不是線程安全的,也就是說蝴乔,多線程使用時(shí)要注意,SqlSession不能共享驮樊;
  2. 所以薇正,SqlSession的最佳作用域?yàn)檎?qǐng)求或方法作用域
  3. 所以囚衔,嚴(yán)禁將SqlSession實(shí)例的引用放在一個(gè)類的靜態(tài)域挖腰,甚至一個(gè)類的實(shí)例變量也不行
1.5 映射器實(shí)例(Mapper Instances)

映射器是一個(gè)你創(chuàng)建來綁定你映射的語(yǔ)句的接口练湿。映射器接口的實(shí)例是從 SqlSession 中獲得的猴仑。因此從技術(shù)層面講,任何映射器實(shí)例的最大作用域是和請(qǐng)求它們的 SqlSession 相同的。盡管如此辽俗,映射器實(shí)例的最佳作用域是方法作用域疾渣。也就是說,映射器實(shí)例應(yīng)該在調(diào)用它們的方法中被請(qǐng)求崖飘,用過之后即可廢棄荸频。并不需要顯式地關(guān)閉映射器實(shí)例宜鸯,盡管在整個(gè)請(qǐng)求作用域(request scope)保持映射器實(shí)例也不會(huì)有什么問題,但是很快你會(huì)發(fā)現(xiàn),像 SqlSession 一樣褒繁,在這個(gè)作用域上管理太多的資源的話會(huì)難于控制。所以要保持簡(jiǎn)單堤尾,最好把映射器放在方法作用域(method scope)內(nèi)服赎。下面的示例就展示了這個(gè)實(shí)踐:

SqlSession session = sqlSessionFactory.openSession();
try {
  BlogMapper mapper = session.getMapper(BlogMapper.class);
  // do work
} finally {
  session.close();
}

總結(jié):方法作用域

1.6 小結(jié)

總結(jié):

  • SqlSessionFactory使用單例模式,全局唯一梁沧;
  • SqlSession即用即創(chuàng)建檀何,用完要關(guān)閉
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末趁尼,一起剝皮案震驚了整個(gè)濱河市埃碱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌酥泞,老刑警劉巖砚殿,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異芝囤,居然都是意外死亡似炎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門悯姊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來羡藐,“玉大人,你說我怎么就攤上這事悯许∑袜拢” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵先壕,是天一觀的道長(zhǎng)瘩扼。 經(jīng)常有香客問我,道長(zhǎng)垃僚,這世上最難降的妖魔是什么集绰? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮谆棺,結(jié)果婚禮上栽燕,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好碍岔,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布浴讯。 她就那樣靜靜地躺著,像睡著了一般付秕。 火紅的嫁衣襯著肌膚如雪兰珍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天询吴,我揣著相機(jī)與錄音掠河,去河邊找鬼。 笑死猛计,一個(gè)胖子當(dāng)著我的面吹牛唠摹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播奉瘤,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼勾拉,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了盗温?” 一聲冷哼從身側(cè)響起藕赞,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卖局,沒想到半個(gè)月后斧蜕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡砚偶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年批销,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片染坯。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡均芽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出单鹿,到底是詐尸還是另有隱情掀宋,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布仲锄,位于F島的核電站劲妙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏昼窗。R本人自食惡果不足惜是趴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一涛舍、第九天 我趴在偏房一處隱蔽的房頂上張望澄惊。 院中可真熱鬧,春花似錦、人聲如沸掸驱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)毕贼。三九已至温赔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鬼癣,已是汗流浹背陶贼。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留待秃,地道東北人拜秧。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像章郁,于是被迫代替她去往敵國(guó)和親枉氮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1. 簡(jiǎn)介 1.1 什么是 MyBatis 暖庄? MyBatis 是支持定制化 SQL聊替、存儲(chǔ)過程以及高級(jí)映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,426評(píng)論 0 4
  • MyBatis 理論篇 [TOC] 什么是MyBatis ?MyBatis是支持普通SQL查詢,存儲(chǔ)過程和高級(jí)映射...
    有_味閱讀 2,883評(píng)論 0 26
  • 1 Mybatis入門 1.1 單獨(dú)使用jdbc編程問題總結(jié) 1.1.1 jdbc程序 上邊使...
    哇哈哈E閱讀 3,293評(píng)論 0 38
  • 引自: MyBatis 3 | 入門 1. 簡(jiǎn)介 MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL培廓、存...
    小淼不賣萌閱讀 268評(píng)論 0 0
  • MySQL被設(shè)計(jì)為一個(gè)可移植的數(shù)據(jù)庫(kù)惹悄,幾乎能在當(dāng)前所有的操作系統(tǒng)上運(yùn)行,如Linux医舆、Solaris俘侠、FreeBS...
    wangfs閱讀 266評(píng)論 0 0