尊重版權: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的所有緩存對象。