session快取理解
前奏知識點:
1、 java物件在jvm中的生命週期?物件被建立分配記憶體空間,只要這個物件被引用變數引用,這個物件就不會被回收器回收。Java集合有一個重要特性,集合存放的是java物件的引用,當向集合中新增物件其實是向集合中新增物件的引用,因此集合沒有清空集合中的物件就一直存活。
2、 如果希望java中的物件A一直處於生命週期,就必須保證至少有一個引用變數引用它,或可以通過其他處於生命週期的物件B導航到這個物件A,比如說在物件B的java集合屬性中存放了物件A的引用。Session介面的實現中包含了一系列的集合,這些集合構成了session的快取,如果session例項沒有結束生命週期,存放在它快取中的物件就不會結束生命週期。
3、 清理快取:session能夠在某些時間點上,按照快取中物件的變化來執行相關的sql語句,來同步更新資料庫,這一過程被稱為清理快取。
理解session的快取:
1、 session快取就是通過集合類實現的,持久化一個物件的時候,物件會被放到快取中,即使程式中沒有引用變數引用它,只要session快取沒有關閉,持久化物件仍然處於生命週期。
2、 作用:減少訪問資料庫的頻率(先在session快取中尋找,若沒有再發出sql語句到資料庫中載入物件);保證資料庫中相關的記錄和快取中的相應記錄的同步,對映檔案建立的是表和類之間的靜態對映,而Session則建立表中的關係資料與執行時session快取的物件的動態對映。
3、 髒物件,session會為存放其中的物件屬性複製一份快照,當清理快取時,會進行髒檢查,即比較當前物件的屬性與它的快照來判斷物件屬性是否發生了變化,如果發生了變化,就稱這個物件是髒物件。
4、 Session會在以下時間點清理快取:當應用程式呼叫org.hibernate.Transaction.commit( );當程式執行查詢操作時,如果快取中的持久化物件屬性發生變化了(查詢物件時,將把物件放到快取中去),就會清理快取;應用程式呼叫session.flush()。