hibernate 快取機制
一級快取
1、當session的save()方法持久化一個customer物件時,customer物件被載入到session的快取中,以後即使應用程式中的引用變數不再引用customer物件,只要session的快取還沒有被清空,customer物件仍然處於生命週期中。
2、當session的get()方法試圖從資料庫中載入一個customer物件時,session先判斷快取中是否已經存在這個customer物件,如果存在嗎,就不需要到資料庫中檢索。從而大大提高應用效能
快取作用:
1、減少訪問資料庫的頻率。用用程式從記憶體中讀取持久化物件的速度顯然比到資料庫中查詢資料的速度快多了,因此session的快取可以提高資料訪問的效能。
2、保證快取中的物件與資料庫中的相關記錄保持同步,當快取中的持久化物件的屬性發生了變換,session並不會立即執行相應的sql語句,這使得session呢呢個夠把幾條相關的sql語句合併成一條sql語句,以便減少訪問資料庫的次數,從而提高應用程式的效能
session清理快取:
1、清理快取是指按照快取中物件的屬性的變換來同步更新資料庫
以下程式程式碼對customer的name屬性修改了兩次
tx=session.beginTransaction();
Customer customer=(Customer)session.get(Customer.class,new Long(1));
customer.setName("JACK");
customer.setName("TOM");
tx.commit();
當session清理快取時,只需要執行一條update語句;
update CUSTOMER set NAME='TOM' ..... where ID=1;
session會在下面的時間點清理快取;
當應用程式呼叫org.hibernate.Transcation的commit()方法的時候,commit()方法先清理快取,然後再向資料庫提交事務。
當應用程式通過HIbernate的query介面等執行查詢操作時,如果快取中持久化物件的屬性發生了變化,就會先清理快取,以保證查詢結果能反映持久化物件的最佳狀態
當應用程式顯示呼叫是session的flush()方法的時候。
二級快取
1、hibernate提供了二級快取,第一級快取是session快取。由於session物件的宣告週期通常對應一個數據庫事務,因此他的快取事務範圍的快取。第一級快取是必須的,不允許而且事實上也不能解除安裝。在第一級快取中,持久化類的每個例項都具有唯一OID。
2、第二級快取是一個可插拔的快取外掛,他由SessionFactory負責管理。由於SessionFactory物件的生命週期和應用程式的整個程序相對應,因此第二級快取是程序範圍或群集範圍的快取。這個快取中存放的是物件的散裝資料。第二級快取是可選的,可以在每個類或每個集合的粒度上配置第二級快取
hibernate應用中java物件的狀態
臨時狀態(transient):剛剛用new語句建立,還沒有被持久化,不處於session的快取中,楚雨淋溼狀態的java物件被稱為臨時物件。
持久化狀態(persistent):已經被持久化,加入到session 的快取中,處於持久化狀態的java物件被稱為持久化物件。
遊離狀態(detached);已經被持久化,但不再處於session的快取中。處於遊離狀態的java物件被稱為遊離物件。
刪除狀態(removed):OID不為null,從一個session的例項的快取中刪除。session在清理快取時,會執行SQL delete語句,刪除資料庫中的相應記錄。一般情況下,應用程式不應該再使用被刪除的物件