Hibernate-Session

當討論Hibernate的Session時,都是在討論它做爲Hibernate的一級緩存出現,當然這是它的功能,但也僅僅是它提供的功能之一,而且是一個附帶功能,
就像Class.forName(),它的功能是加載一個類型並將此類型的Class對象返回,可是更多的時候我們都忽略了它的返回值,只是使用它會引起類加載
的功能.現再你還記得Session的功能除了做爲Hibernate的一級緩存之外的其它功能嗎...
它所提供的功能要從它所解決的問題入手,我們先來看一下它所關注的問題.  問題就是數據存取當中的行爲問題.
行爲問題指的是如何讓各種對象從數據庫中讀取出來以及保存到數據庫中,在這一過程中需要注意的問題.
1.首先的一個問題就是併發問題,當你從數據庫中讀取一條數據出來,可是就在此時,其它人也讀取了這條數據,如果都是僅僅讀取,那問題不大,但如果
都修改呢,同時修改共享資源,併發問題就出現了,這就要保證這一過程是在一個事務範圍內.
2.就是從數據庫中加載記錄,在這一操作範圍內要保證只有一個對象和這條記錄相對應,應該記住的是這個操作過程其實從數據庫到應用程序
內的延伸,雖然執行位置換了,但它們都要做出一致的承諾.
3,讀取出一個對象後你很可能希望修改下對象的狀態,這時要跟蹤對象的狀態變化,生成相應的sql語句.
4,對於新建行的的id重新獲取.
5.對象與對象是有依賴關係的,對象很容易表達雙向關聯,但數據庫只能表達單向關聯.雙向關聯的對象應該根據其中一方的狀態生成sql語句,避免無謂的sql語句.
     查詢對象,因爲是關聯的,會連帶查詢出很多對象,有些是不必要的,要使用延遲加載,防止程序不會使用到的對象而被查詢出來.
6.按排sql語句的執行順序,insert,update,delete的先後順序,及級聯操作時的行爲.保證插入時首先插入主表數據,其次是從表數據,刪除時首先刪除從表數據,其次是主表數據.
    還包括其它更豐富的的級聯更新行爲.
 
 
Session很好的解決了這些問題.
對象標識符和主鍵相對應,在Session內部維護一個哈希表,當從數據庫查詢出一條記錄,它會首先檢查哈希表中是否有對應的對象,存在所查對象就直接從哈希表中取出,
不存在就添加到哈希表中,並返回此對象,Session如何判斷對象的狀態是否發生了改變呢?它用一種快照的方式,就是當查詢出一條記錄相應的在內存中生成對應的對象,然後保留
這個對象的一個拷貝,當對象狀態改變後,Session根據變化後的狀態和留有的快照對比,以生成相應的sql語句,當事務提交之前,Session整理這一組sql語句,按照正確的順序作爲
一個批處理進行執行.  在跟蹤對象狀態時,需要將對象緩存,但一定要記住,它的主要目的在於一致性,而不是提高性能.
發佈了3 篇原創文章 · 獲贊 3 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章