關於hibernate中的session與數據庫鏈接關係以及getCurrentSession 與 openSession() 的區別

1.session與connection,是多對一關係,每一個session都有一個與之對應的connection,一個connection不一樣時刻能夠供多個session使用。
 
2.多個session與一個connection綁定,底層操做數據庫的時會進行同步。
 
3.若是某個connection正在被某個session佔用, open一個session,則建立一個新的connection與之對應。
 
4.有鏈接池的狀況下,session關閉後,connection不必定關閉, 還能夠查詢到應用佔用的鏈接,若超過最大空閒時間,被鏈接池回收釋放。
 
5.有鏈接池的狀況下,session使用完後不關閉,該connection被佔用,若超過鏈接回收時間,也可被鏈接池回收釋放。
 
6.非鏈接池狀況下,一個session佔用一個connection,若不關閉,該connection沒法釋放。
 
7.每一個open的session都須要close。
 
 

1 getCurrentSession建立的session會和綁定到當前線程,而openSession不會。sql

2 getCurrentSession建立的線程會在事務回滾或事物提交後自動flush,自動關閉,而openSession必須手動flush,關閉。數據庫

使用getCurrentSession有什麼好處?設計模式

getCurrentSession()的功能要從ThreadLocal類提及,ThreadLocal是一個線程做用範圍的對象,就是說保存在他中的對象的生命週期是一個線程,Spring調用該方法後會將打開的Session放入ThreadLocal中進行保存,而後經過getCurrentSession()方法返回保存的Session對象,這樣在一次請求(一個線程)中調用getCurrentSession()就都會從ThreadLocal中取出保存的Session對象,這樣就保障了一次請求(一個線程)中使用的都是同一個Session對象了,能夠保障事務操做的特性,像數據一致性和數據安全性(session不是線程安全的)等。緩存

 

1》Configuration接口的做用是對Hibernate進行配置,以及對它進行啓動。在Hibernate的啓動過程當中,Configuration類的實例首先定位映射文檔的位置,讀取這些配置,而後建立一個SessionFactory對象。安全

2》這裏用到了一個設計模式――工廠模式,用戶程序從工廠類SessionFactory中取得Session的實例。   
    
    令你感到奇怪的是SessionFactory並非輕量級的!實際上它的設計者的意圖是讓它能在整個應用中共享。典型地來講,一個項目一般只須要一 個SessionFactory就夠了,可是當你的項目要操做多個數據庫時,那你必須爲每一個數據庫指定一個SessionFactory。   
  SessionFactory在Hibernate中實際起到了一個緩衝區的做用,它緩衝了Hibernate自動生成的SQL語句和一些其它的映射數據,還緩衝了一些未來有可能重複利用的數據。   session

3》Session接口對於Hibernate   開發人員來講是一個最重要的接口。然而在Hibernate中,實例化的Session是一個輕量級的類,建立和銷燬它都不會佔用不少資源。這在實際項目 中確實很重要,由於在客戶程序中,可能會不斷地建立以及銷燬Session對象,若是Session的開銷太大,會給系統帶來不良影響。但值得注意的是 Session對象是非線程安全的,所以在你的設計中,最好是一個線程只建立一個Session對象。   
    
    在Hibernate的設計者的頭腦中,他們將session看做介於數據鏈接與事務管理一種中間接口。咱們能夠將session想象成一個持久對象 的緩衝區,Hibernate能檢測到這些持久對象的改變,並及時刷新數據庫。咱們有時也稱Session是一個持久層管理器,由於它包含這一些持久層相 關的操做,諸如存儲持久對象至數據庫,以及從數據庫從得到它們。   線程

 

對於session一級緩存的說法:設計

Hibernate中的Session是一級緩存,能夠理解爲線程的緩存,在線程運行期間一直存在。對象

session能夠理解爲一個能夠操做數據庫的對象,該對象中有操做數據庫的方法,而且session能夠存儲要發送給DB的sql語句,緩存從DB中已經查出來的數據等。接口

在Java裏面,緩存一般是指Java對象的屬性佔用的內存空間,一般是一些集合類型的屬性。在Session接口的實現類SessionImpl中定義了一系列的Java集合,這些Java集合就構成了Session的緩存。

相關文章
相關標籤/搜索