久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

    1. <style id="76ofp"></style>

      <style id="76ofp"></style>
      <rt id="76ofp"></rt>
      <form id="76ofp"><optgroup id="76ofp"></optgroup></form>
      1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機構(gòu)

        手機站
        千鋒教育

        千鋒學習站 | 隨時隨地免費學

        千鋒教育

        掃一掃進入千鋒手機站

        領(lǐng)取全套視頻
        千鋒教育

        關(guān)注千鋒學習站小程序
        隨時隨地免費學習課程

        當前位置:首頁  >  技術(shù)干貨  > MyBatis之線程優(yōu)化

        MyBatis之線程優(yōu)化

        來源:千鋒教育
        發(fā)布人:小鋒
        時間: 2019-09-18 15:57:00 1568793420

          前言

          我們的項目存在大量用戶同時訪問的情況,那么就會出現(xiàn)大量線程并發(fā)訪問數(shù)據(jù)庫,這樣會帶來線程同步問題,本章我們將討論MyBatis的線程同步問題和優(yōu)化方法。

          MyBatis的線程同步問題

          MyBatis需要通過SqlSession實現(xiàn)數(shù)據(jù)庫操作,而SQLSession內(nèi)部的實現(xiàn)需要使用JDBC的Connection連接對象,而Connection對象是非線程安全的,當多個線程同時訪問時,就可能出現(xiàn)線程同步的問題。

          線程同步的解決方法

          我們前面學習過解決線程同步的方法是:鎖機制。

          我們可以給所有數(shù)據(jù)庫相關(guān)方法或代碼添加synchronized關(guān)鍵字,本質(zhì)上是讓所有線程排隊執(zhí)行這些操作。

        圖片1

          這樣解決了線程同步問題,但是會帶來執(zhí)行效率的降低,如果大量的用戶訪問時會導致長時間的等待,所以今天我們將學習另一種解決方法。

          ThreadLocal解決線程同步

          ThreadLocal(線程局部變量),可以為每個線程創(chuàng)建對象的副本,這樣就不存在多線程訪問一個對象的情況,以空間換時間,效率高,速度快,但是內(nèi)存空間消耗更大。

        圖片2

          ThreadLocal的用法

          創(chuàng)建方法:

          ThreadLocal<數(shù)據(jù)的類型> threadLocal = new ThreadLocal<數(shù)據(jù)類型>();

          數(shù)據(jù)的類型是每個線程中需要保存數(shù)據(jù)的類型。

          數(shù)據(jù)存取:

          void set(Object 數(shù)據(jù)) 將數(shù)據(jù)和當前線程綁定起來。

          Object get() 從當前線程中獲得綁定的數(shù)據(jù)。

          Session線程安全的優(yōu)化方法

          1)創(chuàng)建ThreadLocal來保存SqlSession

          2)編寫獲得SqlSession的方法

          1.調(diào)用ThreadLocal的get方法來獲得SqlSession

          2.如果SqlSession對象為null,調(diào)用工廠來創(chuàng)建SqlSession,使用ThreadLocal的set方法保存到線程中,返回SqlSession對象

          3.如果SqlSession對象不為null,就直接返回

          示例代碼:

          /**

          * MyBatis工具類

          * 用于獲得當前線程中的SqlSession

          * 使用ThreadLocal解決線程安全問題

          */

          public class MyBatisUtils {

          public static final String CONFIG_FILENAME = "mybatis-config.xml";

          //使用ThreadLocal保存SQLSession對象

          private static ThreadLocal threadLocal = new ThreadLocal();

          //SqlSession的工廠,單例

          private static SqlSessionFactory factory = null;

          /**

          * 創(chuàng)建工廠

          */

          public static void buildFactory(){

          try {

          factory = new SqlSessionFactoryBuilder().build(

          Resources.getResourceAsStream(CONFIG_FILENAME));

          } catch (IOException e) {

          e.printStackTrace();

          }

          }

          //在靜態(tài)代碼塊中執(zhí)行,保證工廠的創(chuàng)建只執(zhí)行一次

          static{

          buildFactory();

          }

          /**

          * 從當前線程中獲得Session

          * @return

          */

          public static SqlSession getSession(){

          //從ThreadLocal獲得線程中的SqlSession

          SqlSession sqlSession = threadLocal.get();

          if(sqlSession == null){

          //如果SqlSession為空,創(chuàng)建SqlSession

          if(factory == null){

          buildFactory();

          }

          sqlSession = factory.openSession();

          //把新創(chuàng)建的SqlSession,存入到ThreadLocal,綁定到線程中

          threadLocal.set(sqlSession);

          }

          return sqlSession;

          }

          /**

          * 關(guān)閉Session

          */

          public static void closeSession(){

          //從ThreadLocal獲得線程中的SqlSession

          SqlSession sqlSession = threadLocal.get();

          if(sqlSession != null){

          //關(guān)閉會話

          sqlSession.close();

          //設(shè)置為null,gc會盡快回收

          sqlSession = null;

          //刪除掉ThreadLocal中的SqlSession

          threadLocal.set(null);

          }

          }

          }

          總結(jié)

          線程同步是進行JavaEE開發(fā)需要重點考慮的問題,MyBatis的SQLSession有線程同步問題,使用ThreadLocal為每個線程綁定自己的SQLSession副本,可以解決線程同步問題,同時不會降低程序執(zhí)行效率。

        tags:
        聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
        10年以上業(yè)內(nèi)強師集結(jié),手把手帶你蛻變精英
        請您保持通訊暢通,專屬學習老師24小時內(nèi)將與您1V1溝通
        免費領(lǐng)取
        今日已有369人領(lǐng)取成功
        劉同學 138****2860 剛剛成功領(lǐng)取
        王同學 131****2015 剛剛成功領(lǐng)取
        張同學 133****4652 剛剛成功領(lǐng)取
        李同學 135****8607 剛剛成功領(lǐng)取
        楊同學 132****5667 剛剛成功領(lǐng)取
        岳同學 134****6652 剛剛成功領(lǐng)取
        梁同學 157****2950 剛剛成功領(lǐng)取
        劉同學 189****1015 剛剛成功領(lǐng)取
        張同學 155****4678 剛剛成功領(lǐng)取
        鄒同學 139****2907 剛剛成功領(lǐng)取
        董同學 138****2867 剛剛成功領(lǐng)取
        周同學 136****3602 剛剛成功領(lǐng)取
        相關(guān)推薦HOT
        市場上C++主要是用來做什么的?

        C++是一種廣泛應用于市場上的編程語言,具有高性能和強大的功能。它的設(shè)計目標是提供高效的底層控制和與硬件交互的能力,同時保持可移植性和可...詳情>>

        2023-10-14 06:01:51
        為什么說PHP與Swoole是優(yōu)異組合?

        PHP與Swoole在Web開發(fā)和網(wǎng)絡(luò)編程領(lǐng)域中,共同構(gòu)成了一種強大的解決方案。什么是PHPPHP是一種廣泛使用的開源服務器端腳本語言,特別適用于Web開...詳情>>

        2023-10-14 05:08:41
        Javaweb開發(fā)為什么需要分前后端?

        Javaweb開發(fā)采用前后端分離的設(shè)計模式是有著諸多理由的,以下分析了這種設(shè)計模式的主要特點和優(yōu)勢。什么是前后端分離在Web開發(fā)中,前后端分離是...詳情>>

        2023-10-14 05:05:24
        瀑布開發(fā)和敏捷開發(fā)的區(qū)別是什么?

        一、開發(fā)流程不同瀑布開發(fā)采用線性的開發(fā)流程,按照預先規(guī)劃的順序依次進行需求分析、設(shè)計、編碼、測試和維護等環(huán)節(jié)。每個環(huán)節(jié)都有明確的交付物...詳情>>

        2023-10-14 04:47:33
        有哪款比較好用的免費的缺陷管理工具?

        一、BugzillaBugzilla是一款廣泛使用的免費缺陷管理工具,具備完善的缺陷管理功能,并支持多用戶協(xié)同工作。Bugzilla提供了強大的搜索和過濾功能...詳情>>

        2023-10-14 04:40:43
        繁昌县| 樟树市| 项城市| 辽阳市| 化隆| 庆元县| 金坛市| 九江县| 牡丹江市| 家居| 杭锦旗| 铁岭市| 绥化市| 根河市| 日土县| 肃北| 施秉县| 浦北县| 濮阳市| 安庆市| 荣昌县| 邳州市| 长子县| 明溪县| 扎兰屯市| 乌苏市| 桐庐县| 安国市| 丹江口市| 滨州市| 天峨县| 宁陕县| 肇州县| 麻城市| 东辽县| 德安县| 同仁县| 蓬莱市| 庆阳市| 东兴市| 舟山市|