hibernate 運用 中的 細節分析

2022-04-15 01:06:25 字數 1250 閱讀 8822

看如下這段**,出自 hibernateutils 類中 :

public

static

final

threadlocal session = new

threadlocal();//為啥要這樣用??

public

static session currentsession() throws

hibernateexception

return

s; }

首先理解threadlocal 這個執行緒map結構類 :threadlocal為解決多執行緒程式的併發問題提供了一種新的思路。使用這個工具類可以很簡潔地編寫出優美的多執行緒程式。

在threadlocal類中有乙個map,用於儲存每乙個執行緒的變數副本,map中元素的鍵為執行緒物件,而值對應執行緒的變數副本。

這裡的theadlocal 對應的 map(執行緒物件,session物件) 目的在於 每個執行緒都有自己操作維護的session物件,達到併發的效果;

threadlocal和執行緒同步機制相比有什麼優勢呢?threadlocal和執行緒同步機制都是為了解決多執行緒中相同變數的訪問衝突問題。

在同步機制中,通過物件的鎖機制保證同一時間只有乙個執行緒訪問變數。這時該變數是多個執行緒共享的,使用同步機制要求程式慎密地分析什麼時候對變數進行讀寫,什麼時候需要鎖定某個物件,什麼時候釋放物件鎖等繁雜的問題,程式設計和編寫難度相對較大。

而threadlocal則從另乙個角度來解決多執行緒的併發訪問。threadlocal會為每乙個執行緒提供乙個獨立的變數副本,從而隔離了多個執行緒對資料的訪問衝突。因為每乙個執行緒都擁有自己的變數副本,從而也就沒有必要對該變數進行同步了。threadlocal提供了執行緒安全的共享物件,在編寫多執行緒**時,可以把不安全的變數封裝進threadlocal。

由於threadlocal中可以持有任何型別的物件,低版本jdk所提供的get()返回的是object物件,需要強制型別轉換。但jdk 5.0通過泛型很好的解決了這個問題,在一定程度地簡化threadlocal的使用,**清單 9 2就使用了jdk 5.0新的threadlocal版本。

概括起來說,對於多執行緒資源共享的問題,同步機制採用了「以時間換空間」的方式,而threadlocal採用了「以空間換時間」的方式。前者僅提供乙份變數,讓不同的執行緒排隊訪問,而後者為每乙個執行緒都提供了乙份變數,因此可以同時訪問而互不影響。

總結以上:threadlocal 處理併發:空間換時間;每個執行緒乙個空間;

同步機制同步語塊:時間還空間;排隊使用共享空間

hibernate中實現運用分級查詢 2

如果使用原生sql語句進行query查詢時,hibernate是不會自動把結果包裝成實體的。所以要手動呼叫addentity class class 等一系列方法。如session.createsqlquery sql addentity class class 注意hibernate3.0.5不支...

spring整合hibernate細節

1.作用?掃瞄cn.aj.web包下的帶有 component,service,repository,controller等註解,並建立bean物件 2.spring整合hibernate時spring幹了什麼?spring幫助hibernate建立了sessionfactory,同時hiberna...

hibernate中的核心類和介面細節總結

一 configuration類 1.讀取hibernate.cfg.xml 3.載入hibernate的驅動,url,使用者名稱,密碼等等 4.管理配置資訊 二 sessionfactory介面 1.快取sql語句和某些資料 稱為session級快取 2.是乙個重量級的類 常駐記憶體,吃記憶體 一...