欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

select fknr from jq_fkqk where jjxh = ?

快的情況

這里寫圖片描述

慢的情況

這里寫圖片描述

通過日志打印mybatis查詢信息時,我觀察到特別慢的時候,并不是因為它查詢很慢,而是因為它需要等待一段很長的時間才開始:

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

說明時間長就出現(xiàn)在這里,這個等待的時間。

??

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

??

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

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

等關(guān)閉了沒有用的session之后,F(xiàn)actory通知你,有空閑的session了,開始準備你的查詢吧,所有才會有等待很長一段時間才出現(xiàn):

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

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

mybatis中SqlSession使用事項

一.SqlSession的使用范圍

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

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

二.SqlSessionFactoryBuilder

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

三.SqlSessionFactory

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

四.SqlSession

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

執(zhí)行過程如下:

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

Environment environment = configuration.getEnvironment();

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

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

4、創(chuàng)建Executor,SqlSession所有操作都是通過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的實現(xiàn)類即DefaultSqlSession,此對象中對操作數(shù)據(jù)庫實質(zhì)上用的是Executor

小結(jié)一下

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

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

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

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

相關(guān)文章

  • SpringMVC通過Ajax處理Json數(shù)據(jù)的步驟詳解

    SpringMVC通過Ajax處理Json數(shù)據(jù)的步驟詳解

    這篇文章主要介紹了SpringMVC通過Ajax處理Json數(shù)據(jù)的步驟詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • 淺談十個常見的Java異常出現(xiàn)原因

    淺談十個常見的Java異常出現(xiàn)原因

    這篇文章主要介紹了十個常見的Java異常出現(xiàn)原因,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java移位運算符詳解實例(小結(jié))

    Java移位運算符詳解實例(小結(jié))

    這篇文章主要介紹了Java移位運算符詳解實例(小結(jié)),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • nexus私服啟動不了問題及解決

    nexus私服啟動不了問題及解決

    這篇文章主要介紹了nexus私服啟動不了問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • springboot-curd基于mybatis項目搭建

    springboot-curd基于mybatis項目搭建

    這篇文章主要介紹了springboot-curd基于mybatis項目搭建,圍繞相關(guān)資料展開詳細內(nèi)容,希望對正在學(xué)習(xí)的你有所幫助,需要的小伙伴也可以參考一下
    2022-01-01
  • 關(guān)于使用ContextClassLoader遇到的問題

    關(guān)于使用ContextClassLoader遇到的問題

    這篇文章主要介紹了關(guān)于使用ContextClassLoader遇到的問題,ContextClassLoader是通過Thread.currentThread().getContextClassLoader()返回該線程上下文的ClassLoader,需要的朋友可以參考下
    2023-10-10
  • Java超詳細分析抽象類和接口的使用

    Java超詳細分析抽象類和接口的使用

    在類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類稱為抽象類,接口是Java中最重要的概念之一,它可以被理解為一種特殊的類,不同的是接口的成員沒有執(zhí)行體,是由全局常量和公共的抽象方法所組成,本文給大家介紹Java抽象類和接口,感興趣的朋友一起看看吧
    2022-04-04
  • Linux配置jdk1.8與jdk17兼容并存并啟動jar包指定jdk版本

    Linux配置jdk1.8與jdk17兼容并存并啟動jar包指定jdk版本

    JDK是Java語言的軟件開發(fā)工具包,主要用于移動設(shè)備、嵌入式設(shè)備上的java應(yīng)用程序,這篇文章主要給大家介紹了關(guān)于Linux配置jdk1.8與jdk17兼容并存并啟動jar包指定jdk版本的相關(guān)資料,需要的朋友可以參考下
    2024-08-08
  • mac下修改idea的jvm運行參數(shù)解決idea卡頓的情況

    mac下修改idea的jvm運行參數(shù)解決idea卡頓的情況

    這篇文章主要介紹了mac下修改idea的jvm運行參數(shù)解決idea卡頓的情況,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Spring?Boot實現(xiàn)JWT?token自動續(xù)期的實現(xiàn)

    Spring?Boot實現(xiàn)JWT?token自動續(xù)期的實現(xiàn)

    本文主要介紹了Spring?Boot實現(xiàn)JWT?token自動續(xù)期,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12

最新評論