最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

為什么mybatis中的SqlSession一定要關(guān)閉

 更新時(shí)間:2021年12月16日 11:06:49   作者:玩人  
這篇文章主要介紹了為什么mybatis中的SqlSession一定要關(guān)閉,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

mybatis的SqlSession一定要關(guān)閉

今天在使用mybatis查詢數(shù)據(jù)時(shí),出現(xiàn)了一個(gè)很奇怪的問(wèn)題。同一條sql語(yǔ)句,查詢時(shí)快時(shí)慢,并且有一定的規(guī)律性,大概每10次查詢中有一次會(huì)特別特別的慢,快的只需要1ms,慢的要20000ms,sql代碼及快慢時(shí)間截圖如下:

select fknr from jq_fkqk where jjxh = ?

快的情況

這里寫(xiě)圖片描述

慢的情況

這里寫(xiě)圖片描述

通過(guò)日志打印mybatis查詢信息時(shí),我觀察到特別慢的時(shí)候,并不是因?yàn)樗樵兒苈?,而是因?yàn)樗枰却欢魏荛L(zhǎng)的時(shí)間才開(kāi)始:

==> Preparing: select fknr from jq_fkqk where jjxh = ?

說(shuō)明時(shí)間長(zhǎng)就出現(xiàn)在這里,這個(gè)等待的時(shí)間。

??

為什么會(huì)要等待這么久呢?我自然而然的看了一下上一次查詢的函數(shù),發(fā)現(xiàn)在函數(shù)里面沒(méi)有session.close(),把這一句加上,問(wèn)題就解決了,速度就飛快了。

??

我本來(lái)想查看官方文檔,查看原因,但是沒(méi)找到,只能結(jié)合我自己的理解來(lái)分析一下。SqlSession是通過(guò)SqlSessionFactory來(lái)構(gòu)造的,相當(dāng)于維護(hù)一個(gè)連接池,當(dāng)我們不停的進(jìn)行查詢的時(shí)候,由于沒(méi)有關(guān)閉連接,導(dǎo)致與數(shù)據(jù)庫(kù)的連接數(shù)量達(dá)到了一個(gè)上限(可能連接池有最大連接數(shù),但是我們有找到文檔)。

到達(dá)上限之后,再次請(qǐng)求查詢時(shí),F(xiàn)actory說(shuō)沒(méi)有連接了,讓你先等一下,它先去判斷哪些SqlSession已經(jīng)沒(méi)有人使用了(類(lèi)似于垃圾回收機(jī)制),然后調(diào)用相應(yīng)的進(jìn)程去自動(dòng)關(guān)閉沒(méi)用的session連接,注意調(diào)用進(jìn)程可是要排隊(duì)的,也要耗時(shí)間。

等關(guān)閉了沒(méi)有用的session之后,F(xiàn)actory通知你,有空閑的session了,開(kāi)始準(zhǔn)備你的查詢吧,所有才會(huì)有等待很長(zhǎng)一段時(shí)間才出現(xiàn):

==> Preparing: select fknr from jq_fkqk where jjxh = ?

這純屬我自己的理解,但是重點(diǎn)還是表達(dá)出來(lái)了,就是Mybatis中的session一定要手動(dòng)去關(guān)閉它,session.close(),不然會(huì)占著資源,導(dǎo)致性能下降!?。?/p>

mybatis中SqlSession使用事項(xiàng)

一.SqlSession的使用范圍

SqlSession中存儲(chǔ)的是編譯好的sql語(yǔ)句,這些sql語(yǔ)句是mybatis配置文件讀取mapper.xml文件生成的,將sql語(yǔ)句存儲(chǔ)到SqlSessionFactory和SqlSession中。封裝了對(duì)數(shù)據(jù)庫(kù)的操作,如:查詢、插入、更新、刪除等。

通過(guò)SqlSessionFactory創(chuàng)建SqlSession,而SqlSessionFactory是通過(guò)SqlSessionFactoryBuilder加載配置文件進(jìn)行創(chuàng)建。在開(kāi)發(fā)中SqlSession在每次使用完都要進(jìn)行關(guān)閉,使用時(shí)創(chuàng)建,也就是多例的,線程安全。SqlSessionFactory在整個(gè)類(lèi)中只有一個(gè)對(duì)象,也就是單例的,單例的線程不安全。

二.SqlSessionFactoryBuilder

SqlSessionFactoryBuilder用于創(chuàng)建SqlSessionFacoty,SqlSessionFacoty一旦創(chuàng)建完成就不需要SqlSessionFactoryBuilder了,因?yàn)镾qlSession是通過(guò)SqlSessionFactory生產(chǎn),所以可以將SqlSessionFactoryBuilder當(dāng)成一個(gè)工具類(lèi)使用,最佳使用范圍是方法范圍即方法體內(nèi)局部變量。

三.SqlSessionFactory

SqlSessionFactory是一個(gè)接口,接口中定義了openSession的不同重載方法,SqlSessionFactory的最佳使用范圍是整個(gè)應(yīng)用運(yùn)行期間,一旦創(chuàng)建后可以重復(fù)使用,通常以單例模式管理SqlSessionFactory。

四.SqlSession

SqlSession是一個(gè)面向用戶的接口, sqlSession中定義了數(shù)據(jù)庫(kù)操作,默認(rèn)使用DefaultSqlSession實(shí)現(xiàn)類(lèi)。

執(zhí)行過(guò)程如下:

1、加載數(shù)據(jù)源等配置信息

Environment environment = configuration.getEnvironment();

2、創(chuàng)建數(shù)據(jù)庫(kù)鏈接

3、創(chuàng)建事務(wù)對(duì)象

4、創(chuàng)建Executor,SqlSession所有操作都是通過(guò)Executor完成,mybatis源碼如下:

if (ExecutorType.BATCH == executorType) {
      executor = newBatchExecutor(this, transaction);
    } elseif (ExecutorType.REUSE == executorType) {
      executor = new ReuseExecutor(this, transaction);
    } else {
      executor = new SimpleExecutor(this, transaction);
    }
if (cacheEnabled) {
      executor = new CachingExecutor(executor, autoCommit);
    }

SqlSession的實(shí)現(xiàn)類(lèi)即DefaultSqlSession,此對(duì)象中對(duì)操作數(shù)據(jù)庫(kù)實(shí)質(zhì)上用的是Executor

小結(jié)一下

每個(gè)線程都應(yīng)該有它自己的SqlSession實(shí)例。SqlSession的實(shí)例不能共享使用,它也是線程不安全的。因此最佳的范圍是請(qǐng)求或方法范圍。絕對(duì)不能將SqlSession實(shí)例的引用放在一個(gè)類(lèi)的靜態(tài)字段或?qū)嵗侄沃小?/p>

打開(kāi)一個(gè) SqlSession;使用完畢就要關(guān)閉它。通常把這個(gè)關(guān)閉操作放到 finally 塊中以確保每次都能執(zhí)行關(guān)閉。如下:

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

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于SpringBoot的SSMP的整合案例

    基于SpringBoot的SSMP的整合案例

    這篇文章主要介紹了SpringBoot整合SSMP的詳細(xì)教程,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • IntelliJ IDEA全局內(nèi)容搜索和替換教程圖解

    IntelliJ IDEA全局內(nèi)容搜索和替換教程圖解

    很多朋友在做項(xiàng)目時(shí),會(huì)在整個(gè)項(xiàng)目里活指定文件夾下進(jìn)行全局搜索和替換,下面小編給大家?guī)?lái)了IntelliJ IDEA全局內(nèi)容搜索和替換教程圖解,需要的朋友參考下吧
    2018-04-04
  • Nacos負(fù)載均衡策略總結(jié)

    Nacos負(fù)載均衡策略總結(jié)

    Nacos 作為目前主流的微服務(wù)中間件,包含了兩個(gè)頂級(jí)的微服務(wù)功能:配置中心和注冊(cè)中心,本文給大家總結(jié)了幾種Nacos負(fù)載均衡策略,通過(guò)圖文結(jié)合介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • Java TreeMap排序算法實(shí)例

    Java TreeMap排序算法實(shí)例

    這篇文章主要介紹了Java TreeMap排序算法,結(jié)合實(shí)例形式分析了TreeMap排序算法的原理、實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-07-07
  • 動(dòng)態(tài)配置Spring Boot日志級(jí)別的全步驟

    動(dòng)態(tài)配置Spring Boot日志級(jí)別的全步驟

    這篇文章主要給大家介紹了關(guān)于動(dòng)態(tài)配置Spring Boot日志級(jí)別的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java利用反射實(shí)現(xiàn)框架類(lèi)的方法實(shí)例

    Java利用反射實(shí)現(xiàn)框架類(lèi)的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于Java利用反射實(shí)現(xiàn)框架類(lèi)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • SpringBoot中多環(huán)境啟動(dòng)配置的教程詳解

    SpringBoot中多環(huán)境啟動(dòng)配置的教程詳解

    在SpringBoot項(xiàng)目的生命周期中,存在不同的環(huán)境,我們就需要針對(duì)不同環(huán)境制定不同名稱的配置文件,里面放置不同環(huán)境下所需的配置項(xiàng),下面小編就來(lái)和大家詳細(xì)講講SpringBoot如何進(jìn)行多環(huán)境啟動(dòng)配置的吧
    2024-02-02
  • Java中的@PostConstruct注解

    Java中的@PostConstruct注解

    本文給大家介紹Java中的@PostConstruct注解的相關(guān)知識(shí),通過(guò)示例代碼給大家補(bǔ)充介紹了Java提供的@PostConstruct注解,Spring是如何實(shí)現(xiàn)的,感興趣的朋友一起看看吧
    2025-04-04
  • JAVA中的日期LocalDate類(lèi)詳細(xì)用法講解

    JAVA中的日期LocalDate類(lèi)詳細(xì)用法講解

    Java中存在一個(gè)日歷表示法的類(lèi)庫(kù),LocalDate類(lèi),如果只想要指定的年月日就可以用這個(gè)LocalDate類(lèi),下面這篇文章主要給大家介紹了關(guān)于JAVA中日期LocalDate類(lèi)詳細(xì)用法講解的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Java TCP編程之Scoket

    Java TCP編程之Scoket

    TCP/IP是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,它會(huì)保證數(shù)據(jù)不丟包、不亂序。TCP全名是Transmission Control Protocol,它是位于網(wǎng)絡(luò)OSI模型中的第四層
    2022-11-11

最新評(píng)論

广安市| 东台市| 东方市| 井研县| 商水县| 贺州市| 长宁县| 河曲县| 泸州市| 绥江县| 开封县| 庄河市| 合阳县| 临朐县| 杨浦区| 南丰县| 潢川县| 蓬溪县| 犍为县| 吉林省| 玉门市| 三门县| 凌海市| 邛崃市| 阳江市| 广饶县| 镇原县| 上饶县| 玛纳斯县| 金寨县| 东平县| 汶川县| 霍林郭勒市| 毕节市| 三明市| 科技| 阳春市| 连江县| 巫山县| 泽州县| 高要市|