首先session是有一級緩衝的,目的是為了減少查詢資料庫的時間,提高效率,一級緩衝的生命週期和session是一樣的,
session.flush()和session.clear()就針對session的一級緩衝的處理。
簡單的說,
1 session.flush()的作用就是將session的緩衝中的資料與資料庫同步。
2 session.clear()的作用就是清除session中的快取資料(不管緩衝與資料庫的同步)。
詳細的說:網上很多這樣的文章,我就不說了,可以看看這篇文章,寫的很詳細。http://blog.csdn.net/lssssss/article/details/6839633
我說一下一些需要注意的資訊:
1 session.clear()的作用是只清除session中的快取資料,但不管緩衝與資料庫的同步。
比如,你執行了
Po po = new Po();
session.save(po),
之後馬上執行session.clear(),在事務結束的時候,這條資料是不會被持久化到資料庫中的,因為一般緩衝是在事務提交的時候進行清理的,當在清理緩衝前就把緩衝給清除了,自然就不會同步到資料庫了。不過這個也有例外的情況,就是當對象使用native產生器來產生主鍵id時,當執行session.save()方法時,就會立馬往資料庫插入一條資料,這時候執行session.clear()也不會影響了。
2 當更新或者儲存大批量資料的時候,可以每固定數量的時候,進行清理緩衝,同時清除緩衝:
for (int i = 0; i < 1000;i ++){
if (i /20 == 0) {
session.flush();
session.clear();
}
}
因為把大量的對象放到session緩衝中會浪費大量的內容空間。
3 執行完session.flush()時,並不意味著資料就肯定持久化到資料庫中的,因為事務控制著資料庫,如果事務提交失敗了,緩衝中的資料還是照樣會被復原的。