麻豆黑色丝袜jk制服福利网站-麻豆精品传媒视频观看-麻豆精品传媒一二三区在线视频-麻豆精选传媒4区2021-在线视频99-在线视频a

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

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

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術干貨  > MyBatis之線程優化

MyBatis之線程優化

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

  前言

  我們的項目存在大量用戶同時訪問的情況,那么就會出現大量線程并發訪問數據庫,這樣會帶來線程同步問題,本章我們將討論MyBatis的線程同步問題和優化方法。

  MyBatis的線程同步問題

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

  線程同步的解決方法

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

  我們可以給所有數據庫相關方法或代碼添加synchronized關鍵字,本質上是讓所有線程排隊執行這些操作。

圖片1

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

  ThreadLocal解決線程同步

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

圖片2

  ThreadLocal的用法

  創建方法:

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

  數據的類型是每個線程中需要保存數據的類型。

  數據存取:

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

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

  Session線程安全的優化方法

  1)創建ThreadLocal來保存SqlSession

  2)編寫獲得SqlSession的方法

  1.調用ThreadLocal的get方法來獲得SqlSession

  2.如果SqlSession對象為null,調用工廠來創建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;

  /**

  * 創建工廠

  */

  public static void buildFactory(){

  try {

  factory = new SqlSessionFactoryBuilder().build(

  Resources.getResourceAsStream(CONFIG_FILENAME));

  } catch (IOException e) {

  e.printStackTrace();

  }

  }

  //在靜態代碼塊中執行,保證工廠的創建只執行一次

  static{

  buildFactory();

  }

  /**

  * 從當前線程中獲得Session

  * @return

  */

  public static SqlSession getSession(){

  //從ThreadLocal獲得線程中的SqlSession

  SqlSession sqlSession = threadLocal.get();

  if(sqlSession == null){

  //如果SqlSession為空,創建SqlSession

  if(factory == null){

  buildFactory();

  }

  sqlSession = factory.openSession();

  //把新創建的SqlSession,存入到ThreadLocal,綁定到線程中

  threadLocal.set(sqlSession);

  }

  return sqlSession;

  }

  /**

  * 關閉Session

  */

  public static void closeSession(){

  //從ThreadLocal獲得線程中的SqlSession

  SqlSession sqlSession = threadLocal.get();

  if(sqlSession != null){

  //關閉會話

  sqlSession.close();

  //設置為null,gc會盡快回收

  sqlSession = null;

  //刪除掉ThreadLocal中的SqlSession

  threadLocal.set(null);

  }

  }

  }

  總結

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

tags:
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
主站蜘蛛池模板: 香港黄页亚洲一级| 夂女yin乱合集高h文| 性做久久久久久久| 国产亚洲精品美女久久久久| 冬月枫在线观看| 国产三级影院| 亚洲欧美成人一区二区在线电影| 日韩三级视频| 乱亲玉米地初尝云雨| 2019天堂精品视频在线观看| 久久精品99视频| 在线播放a1| 免费无遮挡肉动漫在线观看 | 欧美性猛交xxxx乱大交丰满| 波多野结衣同性| 最好看的中文字幕视频2018| 日本边添边摸边做边爱的视频| 红色一片免费高清影视| 婷婷色天使在线视频观看| 三级黄色片子| 国产精品免费播放| 亚洲香蕉电影| 公车揉捏h| 波多野结衣按摩| 波多野结衣作品在线观看| 欧美亚洲国产一区二区三区| 欧美色欧美亚洲高清在线视频| 884aa四虎四虎永久播放地址| 韩国美女主播免费的网站 | 国色天香社区高清在线观看| 久草资源| 欧美日韩免费在线视频| 乱人伦中文视频在线观看免费 | 美女让男人捅爽| 调教女m视频免费区| 亚洲国产一成人久久精品| 老八吃屎奥利给原视频带声音的| 日本免费三区| 产国语一级特黄aa大片| 久久伊人免费视频| 成年福利片120秒体验区|