1. 程式人生 > >物件持久化和一級快取、二級快取

物件持久化和一級快取、二級快取

1.物件持久化和一級快取 物件的三種狀態(對於Hibernate來說,物件狀態分為三種) (1)暫時態 當物件剛建立和Session沒有發生任何關係時,程式執行完就立刻消失,稱為暫時態 (2)持久態 當執行如下程式碼時,物件變為持久態. Emp e = new Emp(); session.save(); 持久態的物件和 Session 發生了關係,如執行了 save、 get、 query 等方法. Session 中會快取該物件(Session 的快取即一級快取),Session 再獲取物件時,首先去查詢一級快取, 如果沒有才查詢資料庫,Session 要負責將持久態物件的變化更新到資料庫.在呼叫flush()方法時更新,事務在提交時會自動呼叫Session的flush()方法. (3)遊離態 呼叫了 session.evict(Object obj)方法,和 Session 解除了關係.

2.二級快取 當從一級快取中查詢時,每個使用者執行緒對應一塊Session快取,假如有多個使用者,就會建立多個Session.假設使用者1要查詢id=1的Emp物件,Session會首先查詢內部是否有id=1的Emp物件,沒有就去資料庫查詢,並儲存到Session中,使用者再訪問時,就不需要去資料庫中查找了,直接從Session中獲得.但是如果多個使用者都要查詢id=1的使用者,那麼這些使用者可能都要先去資料庫中查詢到結果,效率降低,並且這些Session中都儲存著id=1的Emp物件,顯然重複了. 由此引入二級快取,二級快取供所有使用者享用,當用戶1查詢id=1的Emp物件,儲存到一級快取的同時,也會在二級快取儲存一份,之後其他使用者再查詢時,只需要到二級快取中查詢即可,不需要連線資料庫.

快取的意義: 快取機制就是將資料庫中常用的資料取出放入記憶體中,程式呼叫時直接從記憶體中取,不用每次使用資料都訪問資料庫,這樣提高了效率。 (1)快取的更新 快取中的資料必須是同資料庫中資料保持一致。 (2)快取的命中率 提高快取資料的利用率,快取中存放的是使用者常用的資料,如果快取中存放的是使用者不常用的,那麼就說快取的命中率不高。有些時候,是某些快取資料在某個時刻使用率高,某個時刻使用率低,所以需要時刻更新,以提高快取命中率。

	一級快取時使用者執行緒獨用的,二級快取時執行緒們共用的。