亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Hibernate用ThreadLocal模式(線程局部變量模式)管理Session

 更新時(shí)間:2019年03月29日 15:45:05   作者:徐劉根  
今天小編就為大家分享一篇關(guān)于Hibernate用ThreadLocal模式(線程局部變量模式)管理Session,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧

Hibernate ThreadLocal

它會為每個(gè)線程維護(hù)一個(gè)私有的變量空間。實(shí)際上, 其實(shí)現(xiàn)原理是在JVM 中維護(hù)一個(gè)Map,這個(gè)Map的key 就是當(dāng)前的線程對象,而value則是 線程通過Hibernate ThreadLocal.set方法保存的對象實(shí)例。當(dāng)線程調(diào)用Hibernate ThreadLocal.get方法時(shí), Hibernate ThreadLocal會根據(jù)當(dāng)前線程對象的引用,取出Map中對應(yīng)的對象返回。

這樣,Hibernate ThreadLocal通過以各個(gè)線程對象的引用作為區(qū)分,從而將不同線程的變量隔離開來。

一、ThreadLocal模式 (線程局部變量模式) 管理Session的理解

(1)在利用Hibernate開發(fā)的時(shí)候如何合理的管理Session,避免Session的頻繁創(chuàng)建和銷毀,對于提高系統(tǒng)的性能來說是非常重要的!

(2)我們知道Session是由SessionFactory負(fù)責(zé)創(chuàng)建的,而SessionFactory的實(shí)現(xiàn)是線程安全的,多個(gè)并發(fā)的線程可以同時(shí)訪問一個(gè)SessionFactory并從中獲取Session實(shí)例,但是遺憾的是Session不是線程安全的。

(3)Session中包含了數(shù)據(jù)庫操作相關(guān)的狀態(tài)信息,那么說如果多個(gè)線程同時(shí)使用一個(gè)Session實(shí)例進(jìn)行CRUD(數(shù)據(jù)庫的增刪改查),就很有可能導(dǎo)致數(shù)據(jù)存取的混亂,我們根本無法想像那些你根本不能預(yù)測執(zhí)行順序的線程對你的一條記錄進(jìn)行操作的情形!

(4)在Session的眾多管理方案中,在今天的學(xué)習(xí)中知道ThreadLocal模式是一種很不錯的解決方案,特分享給大家!

(5)我們首先要明白的是ThreadLocal并非是一個(gè)線程的本地實(shí)現(xiàn)版本,它并不是一個(gè)Thread,而是thread local variable(線程局部變量)。(也許把它命名為ThreadLocalVar更加合適)。線程局部變量(ThreadLocal)其實(shí)的功用非常簡單,就是為每一個(gè)使用某變量的線程都提供一個(gè)該變量值的副本,是每一個(gè)線程都可以獨(dú)立地改變自己的副本,而不會和其它線程的副本沖突。從線程的角度看,就好像每一個(gè)線程都完全擁有一個(gè)該變量。

(6)更具體的來說就是:ThreadLocal并非等同于線程成員變量,ThreadLocal該類提供了線程局部變量。這個(gè)局部變量與一般的成員變量不一樣,ThreadLocal的變量在被多個(gè)線程使用時(shí)候,每個(gè)線程只能拿到該變量的一個(gè)副本,這是Java API中的描述,但更準(zhǔn)確的說,應(yīng)該是ThreadLocal類型的變量內(nèi)部的注冊表(Map<Thread,T>)發(fā)生了變化,但ThreadLocal類型的變量本身的確是一個(gè),這才是本質(zhì)!

(7)ThreadLocal的原理:在ThreadLocal類中有一個(gè)Map,用于存儲每一個(gè)線程的變量的副本。比如下面的示例實(shí)現(xiàn):

public class ThreadLocal {
<span style="white-space:pre"> </span>private Map values = Collections.synchronizedMap(new HashMap());
<span style="white-space:pre"> </span>public Object get() {
<span style="white-space:pre"> </span>Thread curThread = Thread.currentThread();
<span style="white-space:pre"> </span>Object o = values.get(curThread);
<span style="white-space:pre"> </span>if (o == null && !values.containsKey(curThread)) {
<span style="white-space:pre">  </span>o = initialValue();
<span style="white-space:pre">  </span>values.put(curThread, o);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>values.put(Thread.currentThread(), newValue);
<span style="white-space:pre"> </span>return o;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public Object initialValue() {
<span style="white-space:pre"> </span>return null;
<span style="white-space:pre"> </span>}
}

二、代碼的展示

(1)使用ThreadLocal模式 (線程局部變量模式) 管理Session的代碼如下:

<span style="font-family:System;font-size:14px;">package com.lc.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/**
 * 升級的MySessionFactory 線程局部模式
 * @author xuliugen
 */
public class HibernateUtil {
 private static SessionFactory sessionFactory = null;
 // 使用線程局部模式
 private static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
 /*
 * 默認(rèn)的構(gòu)造函數(shù)
 */
 private HibernateUtil() {
 }
 /*
 * 靜態(tài)的代碼塊
 */
 static {
 sessionFactory = new Configuration().configure().buildSessionFactory();
 }
 /*
 * 獲取全新的的session
 */
 public static Session openSession() {
 return sessionFactory.openSession();
 }
 /*
 * 獲取和線程關(guān)聯(lián)的session
 */
 public static Session getCurrentSession() {
 Session session = threadLocal.get();
 // 判斷是是是否得到
 if (session == null) {
  session = sessionFactory.openSession();
  // 把session放到 threadLocal,相當(dāng)于該session已經(jīng)于線程綁定
  threadLocal.set(session);
 }
 return session;
 }
}</span>

(2)測試代碼如下:

<span style="font-family:System;font-size:14px;">package com.lc.view;
import org.hibernate.Session;
import com.lc.util.HibernateUtil;
public class TestHibernateUtil {
 public static void main(String[] args) {
 Session s1 = HibernateUtil.getCurrentSession(); 
 Session s2 = HibernateUtil.getCurrentSession();
 System.out.println(s1.hashCode()+"  "+s2.hashCode());
 /*
  * 1432950766  1432950766
  * 結(jié)果是兩個(gè)hashCode是一樣的,證明是線程相關(guān)的
  */
 }
}</span><span style="font-family:System;font-size:14px;">
</span>

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

相關(guān)文章

  • java中的Io(input與output)操作總結(jié)(四)

    java中的Io(input與output)操作總結(jié)(四)

    前面已經(jīng)把java io的主要操作講完了,這一節(jié)我們來說說關(guān)于java io的其他內(nèi)容:Serializable序列化/DataOutputStream和DataInputStream類/管道流等等,感興趣的朋友可以了解下
    2013-01-01
  • Java 添加、替換、刪除PDF中的圖片的示例代碼

    Java 添加、替換、刪除PDF中的圖片的示例代碼

    這篇文章主要介紹了Java 添加、替換、刪除PDF中的圖片,本文通過示例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 基于Feign傳輸對象無法接收參數(shù)的問題

    基于Feign傳輸對象無法接收參數(shù)的問題

    這篇文章主要介紹了基于Feign傳輸對象無法接收參數(shù)的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 基于Session的國際化實(shí)現(xiàn)方法

    基于Session的國際化實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄赟ession的國際化實(shí)現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-08-08
  • mybatis深入講解resultMap的定義及用法

    mybatis深入講解resultMap的定義及用法

    MyBatis的每一個(gè)查詢映射的返回類型都是ResultMap,當(dāng)我們提供返回類型屬性是resultType時(shí),MyBatis會自動給我們把對應(yīng)值賦給resultType所指定對象的屬性,當(dāng)我們提供返回類型是resultMap時(shí),將數(shù)據(jù)庫中列數(shù)據(jù)復(fù)制到對象的相應(yīng)屬性上,可以用于復(fù)制查詢,兩者不能同時(shí)用
    2022-04-04
  • Java enum關(guān)鍵字不識別的快速解決辦法

    Java enum關(guān)鍵字不識別的快速解決辦法

    這篇文章主要介紹了Java enum關(guān)鍵字不識別的快速解決辦法,非常不錯,具有參考借鑒價(jià)值,感興趣的朋友一起看看吧
    2016-09-09
  • Java流程控制之順序結(jié)構(gòu)

    Java流程控制之順序結(jié)構(gòu)

    Java中的流程控制語句可以這樣分類:順序結(jié)構(gòu),選擇結(jié)構(gòu),循環(huán)結(jié)構(gòu)。下面文章我們就來看看來順序結(jié)構(gòu)的詳細(xì)介紹,主要以順序結(jié)構(gòu)簡單圖示及詳細(xì)解說該內(nèi)容,需要的小伙伴可以參考一下
    2021-12-12
  • jvm排查工具箱jvm-tools下載使用詳解

    jvm排查工具箱jvm-tools下載使用詳解

    這篇文章主要為大家介紹了jvm排查工具箱jvm-tools下載使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • 沒有編輯器的環(huán)境下是如何創(chuàng)建Servlet(Tomcat+Java)項(xiàng)目的?

    沒有編輯器的環(huán)境下是如何創(chuàng)建Servlet(Tomcat+Java)項(xiàng)目的?

    今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著在沒有編輯器的環(huán)境下如何創(chuàng)建Servlet(Tomcat+Java)項(xiàng)目展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Java實(shí)現(xiàn)三子棋小游戲簡易版

    Java實(shí)現(xiàn)三子棋小游戲簡易版

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)三子棋小游戲簡易版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評論