.NET進階—Nhibernate之Session

  Nhibernate就是Hibernate的.NET版,原理相同,下文都是從Hibernate說的,因爲Hibernate的資料相對更多些。


  首先解決上篇博客最後的一個小問題,以前開發中使用的Session通常用來一些經常被用到的用戶Id,權限等等,表示客戶端與服務器的會話;在Hibernate中Session是操作數據庫的句柄對象,表示與數據庫的會話。所以說從意思上說都表示一次會話,但會話的本質卻不同。


什麼是Session

  Session是Hibernate嚮應用程序提供操作數據的主要接口,提供了load,get,save,update等方法,其實就是對Connection的一個高級封裝,一個Session就對應一個Connection

  同時爲了提高性能,Hibernate提供了兩種級別的緩存,其中一級緩存就是Session級的緩存,就是將以上方法操作的對象放入緩存進行管理,在需要數據時首先從緩存中獲取,以此來提高系統的性能。


什麼是緩存

  爲了能夠更好的理解Session緩存,首先來了解緩存,說到緩存一般都會想到計算機的緩存,比如CPU的高速緩存,優先於內存與CPU交換數據。而在ORM框架的中的緩存一般存在三種形式:

  1事務級緩存:即在當前事務範圍內的數據緩存.就Hibernate來講,事務級緩存是基於Session的生命週期實現的,每個Session內部會存在一個數據緩存,它隨着 Session的創建而存在,隨着Session的銷燬而滅亡,因此也稱爲Session LevelCache.

  2應用級緩存:即在某個應用中或應用中某個獨立數據庫訪問子集中的共享緩存,此緩存可由多個事務共享(數據庫事務或應用事務),事務之間的緩存共享策略與應用的事務隔離機制密切相關.在Hibernate中,應用級緩存由SessionFactory實現,所有由一個SessionFactory創建的 Session實例共享此緩存,因此也稱爲SessionFactoryLevel Cache.

  3分佈式緩存:即在多個應用實例,多個JVM間共享的緩存策略.分佈式緩存由多個應用級緩存實例組成,通過某種遠程機制(RMI,JMS)實現各個緩存實例間的數據同步,任何一個實例的數據修改,將導致整個集羣間的數據狀態同步.


  如上所述,Session緩存就屬於其中的事務級緩存,Session對象的生命週期也就對應一個數據庫事務或者一個應用事務,這樣也使得一個線程對應一個Session,一個用戶就是一個線程,保證了線程中對象和數據庫的同步。


Session緩存的管理

  

  當調用Session的save()、update()、saveOrUpdate()、get()或load(),以及調用查詢接口的 list()、iterate()或filter()方法時,如果在Session緩存中還不存在相應的對象,Hibernate就會把該對象加入到第一級緩存中。當清理緩存時,Hibernate會根據緩存中對象的狀態變化來同步更新數據庫。


小結

  項目中遇到的問題更多是級聯更新或者保存,如果只是單表操作,基本不用去關心Session什麼時候開啓的,什麼時候關閉的,但是當涉及到級聯或者事務內操作時經常遇到Session緩存的問題,而通過這次的項目也從錯誤中總結出了規律,現在再通過原理進行學習,感覺明朗了很多。下篇繼續Hibernate級聯操作。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章