Hibernate快取簡介及領域物件的三種狀態
1. Session級別的快取又叫做一級快取;SessionFactory級別的快取叫做二級快取。
2.理解Session的快取:
•當Session的save()方法持久化一個Customer物件時,Customer物件被加入到Session的快取中,以後即使應用程式中的引用變數不再引用Customer物件,只要Session的快取還沒有被清空,Customer物件仍然處於生命週期中。
•當Session的load()方法試圖從資料庫中載入一個Customer物件時,Session先判斷快取中是否已經存在這個Customer物件,如果存在,就不需要再到資料庫中檢索。
例:
tx = session.beginTransaction(); Customer c1=new Customer(“zhangsan",new HashSet()); //Customer物件被持久化,並且加入到Session的快取中 session.save(c1); Long id=c1.getId(); //c1變數不再引用Customer物件 c1=null; //從Session快取中讀取Customer物件,使c2變數引用Customer物件 Customer c2=(Customer)session.load(Customer.class,id); tx.commit(); //關閉Session,清空快取 session.close(); //訪問Customer物件 System.out.println(c2.getName()); // c2變數不再引用Customer物件,此時Customer物件結束生命週期。 c2=null; tx = session.beginTransaction(); Customer c1=(Customer)session.load(Customer.class,new Long(1)); Customer c2=(Customer)session.load(Customer.class,new Long(1)); System.out.println(c1==c2); // true or false ?? tx.commit(); session.close();
3.Session的快取的作用:
•(1)減少訪問資料庫的頻率。應用程式從記憶體中讀取持久化物件的速度顯然比到資料庫中查詢資料的速度快多了,因此Session的快取可以提高資料訪問的效能。
•(2)保證快取中的物件與資料庫中的相關記錄保持同步。當快取中持久化物件的狀態發生了變化,Session並不會立即執行相關的SQL語句,這使得Session能夠把幾條相關的SQL語句合併為一條SQL語句,以便減少訪問資料庫的次數,從而提高應用程式的效能。
4.Session清理快取:
•清理快取是指按照快取中物件的狀態的變化來同步更新資料庫
•以下程式程式碼對Customer的name屬性修改了兩次:tx = session.beginTransaction(); Customer customer=(Customer)session.load(Customer.class, new Long(1)); customer.setName("Jack"); customer.setName("Mike"); tx.commit();
•當Session清理快取時,只需執行一條update語句:
updateCUSTOMERS set NAME= 'Mike'…… where ID=1;
5.清理快取的時間點:
•Session會在下面的時間點清理快取:
–當應用程式呼叫org.hibernate.Transaction的commit()方法的時候,commit()方法先清理快取,然後再向資料庫提交事務。
–當應用程式顯式呼叫Session的flush()方法的時候。
6.Hibernate的二級快取結構:
•Hibernate提供了兩級快取,第一級快取是Session的快取。由於Session物件的生命週期通常對應一個數據庫事務或者一個應用事務,因此它的快取是事務範圍的快取。第一級快取是必須的,不允許而且事實上也無法被卸除。在第一級快取中,持久化類的每個例項都具有惟一的OID。
•第二級快取是一個可插拔的快取外掛,它由SessionFactory負責管理。由於SessionFactory物件的生命週期和應用程式的整個程序對應,因此第二級快取是程序範圍的快取。這個快取中存放的是物件的散裝資料。第二級快取是可選的,可以在每個類或每個集合的粒度上配置第二級快取。
7、在hibernate中java物件的狀態:
•臨時狀態(transient):剛剛用new語句建立,還沒有被持久化,不處於Session的快取中。處於臨時狀態的Java物件被稱為臨時物件。
•持久化狀態(persistent):已經被持久化,加入到Session的快取中。處於持久化狀態的Java物件被稱為持久化物件。
•遊離狀態(detached):已經被持久化,但不再處於Session的快取中。處於遊離狀態的Java物件被稱為遊離物件。
物件的狀態轉換圖:
例:Customer物件的狀態轉換過程:
8.用Session的update()方法關聯遊離物件:
程式碼 |
說明 |
Customer customer=newCustomer(); customer.setName("Tom"); Session session1=sessionFactory.openSession(); Transaction tx1 = session1.beginTransaction(); session1.save(customer); tx1.commit(); session1.close(); //此時Customer物件變為遊離物件 Session session2=sessionFactory.openSession(); Transaction tx2 = session2.beginTransaction(); customer.setName(“zhangsan") //在和session2關聯之前修改Customer物件的屬性 session2.update(customer); customer.setName(“lisi"); //在和session2關聯之後修改Customer物件的屬性 tx2.commit(); session2.close(); |
•Session的update()方法完成以下操作: –(1)把Customer物件重新加入到Session快取中,使它變為持久化物件。 –(2)計劃執行一個update語句。值得注意的是,Session只有在清理快取的時候才會執行update語句,並且在執行時才會把Customer物件當前的屬性值組裝到update語句中。因此,即使程式中多次修改了Customer物件的屬性,在清理快取時只會執行一次update語句。 |
9.客戶層與業務邏輯層之間傳遞臨時物件和遊離物件的過程:
轉載請註明出處:http://blog.csdn.net/jialinqiang/article/details/8718169