首先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()時,並不意味着數據就肯定持久化到數據庫中的,因爲事務控制着數據庫,如果事務提交失敗了,緩存中的數據還是照樣會被回滾的。
- 頂