国产睡熟迷奷白丝护士系列精品,中文色字幕网站,免费h网站在线观看的,亚洲开心激情在线

      <sup id="hb9fh"></sup>
          1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

            手機(jī)站
            千鋒教育

            千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

            千鋒教育

            掃一掃進(jìn)入千鋒手機(jī)站

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

            關(guān)注千鋒學(xué)習(xí)站小程序
            隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

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

            MyBatis之線程優(yōu)化

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

              前言

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

              MyBatis的線程同步問(wèn)題

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

              線程同步的解決方法

              我們前面學(xué)習(xí)過(guò)解決線程同步的方法是:鎖機(jī)制。

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

            圖片1

              這樣解決了線程同步問(wèn)題,但是會(huì)帶來(lái)執(zhí)行效率的降低,如果大量的用戶(hù)訪問(wèn)時(shí)會(huì)導(dǎo)致長(zhǎng)時(shí)間的等待,所以今天我們將學(xué)習(xí)另一種解決方法。

              ThreadLocal解決線程同步

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

            圖片2

              ThreadLocal的用法

              創(chuàng)建方法:

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

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

              數(shù)據(jù)存?。?/p>

              void set(Object 數(shù)據(jù)) 將數(shù)據(jù)和當(dāng)前線程綁定起來(lái)。

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

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

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

              2)編寫(xiě)獲得SqlSession的方法

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

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

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

              示例代碼:

              /**

              * MyBatis工具類(lèi)

              * 用于獲得當(dāng)前線程中的SqlSession

              * 使用ThreadLocal解決線程安全問(wèn)題

              */

              public class MyBatisUtils {

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

              //使用ThreadLocal保存SQLSession對(duì)象

              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();

              }

              /**

              * 從當(dāng)前線程中獲得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)閉會(huì)話

              sqlSession.close();

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

              sqlSession = null;

              //刪除掉ThreadLocal中的SqlSession

              threadLocal.set(null);

              }

              }

              }

              總結(jié)

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

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

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

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

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

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

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

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

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

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

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

            2023-10-14 04:40:43
            快速通道