2009-12-01 102 views
0

修改第一級緩存的記錄,我知道當我們做save​​orupdate時,我們需要調用flush()來刷新緩存,以便後續的數據庫選擇查詢。因此,對於使用休眠的應用程序,我們不應該通過使用DB-GUI修改記錄/刪除記錄,而不會通過休眠,因爲select會因爲緩存而查詢錯誤的結果。正確?一級休眠緩存,直接在DB

回答

3

不正確。第一級緩存始終與自身保持一致,並與該會話中進行的更新保持一致。會議結束後,所有剩餘的更新都會自動刷新,您很少必須自己撥打flush()

此外,第一級高速緩存只持續hibernate會話期間(通常只持續幾個SQL語句,通常持續時間不到一秒),因此對數據庫直接進行的任何更新都將會體現在下一次開始的hibernate會話中。

+0

對於二級緩存怎麼樣。我敢肯定,如果我直接在數據庫中修改記錄,hibernate應用程序仍然會從緩存中重新獲取而不知道它? – cometta 2009-12-01 09:59:32

+1

是的,對L2高速緩存來說可能是正確的,但是你的問題是關於L1(會話)高速緩存。區分兩者非常重要,行爲是非常不同的。 – skaffman 2009-12-01 10:00:27

+0

而'CacheMode'就是這個。 – 2009-12-01 10:02:36

1

想象一下,如果FlushMode設置爲Auto,則在進行任何可能已受影響的HQL或條件查詢之前,應刷新它。如果您正在進行SQL查詢(或者您在進行HQL查詢並且FlushMode不是自動的),則需要刷新,否則當發生SQL查詢時,更改不會反映在數據庫中。

此外,如果您未使用事務,則需要在處理會話之前調用flush。

看看這個https://www.hibernate.org/hib_docs/v3/api/org/hibernate/FlushMode.html