天天看點

【JAVA學習】session 清理緩存的了解 和 如何 清空緩存中的資料

尊重版權:http://blog.sina.com.cn/s/blog_62a151be0100nf28.html

Session執行一些sql語句把記憶體中的對象的狀态同步到資料庫,這個過程被稱為session清理.

在預設情況下,Session會在下面的時間點清理緩存。

1 當應用程式調用net.sf.hibernate.Transacation的commit()方法的時候,commit()方法先清理緩存,然後再向資料庫送出事務。

2 當應用程式調用Session的find()或者iterate()時,如果緩存中持久化對象的屬性發生了變化,就會先清理緩存,以保證查詢結果能反映持久化對象的最新狀态。

3 當應用程式顯示調用Session的flush()方法的時候。

注意Session的commit()和flush()方法的差別。flush()方法進行清理緩存的操作,執行一系列的SQL語句,但不會送出事務;commit()方法會先調用flush()方法,然後送出事務。送出事務意味着對資料庫所做的更新被永久儲存下來。

執行session清理的順序:

1.按照應用程式調用session.save()方法的銜後順序,執行所有對實進行插入的insert語句。

2.執行所有對實體進行更新的update語句。

3.執行所有對集合進行删除的delete語句。

4.執行所有對集合元素進行删除、更新或者插入的SQL語句。

5.執行所有對集合進行插入的insert語句。

6.按照應用程式調用session.delete()方法的先後順序,執行所有對實體進行删除的delete語句。

Session的setFlushMode()方法用于設定清理緩存的時間點。FlushMode類定義了三種不同的清理模式:FlushMode.AUTO、FlushMode.COMMIT和FlushMode.NEVER。

 清理緩存的模式  Session的查詢方法  Session的commit()方法  Session的flush()方法
 FlushMode.AUTO  清理  清理  清理
 FlushMode.COMMIT  不清理  清理  清理
 FlushMode.NEVER  不清理  不清理  不清理

在批量處理大量資料的時候為了避免記憶體溢出,可手動幹預一級緩存:

Session.evict 将某個對象從一級緩存移除;如:getSession().evict(member);

Session.clear 清理該session的所有緩存對象。