Hibernate Session的Flush模式
2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
首先要知道的是:
Hibernate會盡量將與數(shù)據(jù)庫的操作延遲,直到必須要與數(shù)據(jù)庫進行交互,例如save方法一般會在提交時才真正執(zhí)行,最終在提交時會以批處理的方式與數(shù)據(jù)庫進行交互,以提高效率。
而將操作延遲,就是利用緩存,將最后要處理的操作放到緩存中。
flush方法的主要作用就是清理緩存,強制數(shù)據(jù)庫與Hibernate緩存同步,以保證數(shù)據(jù)的一致性。它的主要動作就是向數(shù)據(jù)庫發(fā)送一系列的sql語句,并執(zhí)行這些sql語句,但是不會向數(shù)據(jù)庫提交。而commit方法則會首先調(diào)用flush方法,然后提交事務(wù)。
?????
????? 在下面的情況下,Hibernate會調(diào)用Session.flush()以清理緩存:
???? 1)事務(wù)提交時,如果flush模式不為FlushMode.NEVER,commit()將調(diào)用flush().
???? 2)在某些查詢語句之前(此查詢語句之前的語句已經(jīng)改變了數(shù)據(jù)庫狀態(tài),所以需要調(diào)用flush()以同步數(shù)據(jù)庫是查出來的數(shù)據(jù)是經(jīng)過更改的)。
????
???? 除非明確地指定了flush()命令,否則關(guān)于Session何時會執(zhí)行這些JDBC調(diào)用完全是無法保證的,只能保證他們執(zhí)行的前后順序。
?
??通過設(shè)置session.setFlushMode(),可以精確控制Hibernate的FlushMode.
??(1)? FlushMode.AUTO:Hibernate判斷對象屬性有沒有改變,如果被更改成為臟數(shù)據(jù),則在一個查詢語句前將更新此改動以保證數(shù)據(jù)庫的同步。這也是Hibernate的默認清理模式。
??(2)?FlushMode.COMMIT:在事務(wù)結(jié)束之前清理session的緩存。這樣有可能導(dǎo)致查出臟數(shù)據(jù)
??(3)?FlushMode.NEVER:除非強制調(diào)用Session.flush(),否則永遠不清理Session。相當(dāng)于將數(shù)據(jù)庫設(shè)置為一個只讀的數(shù)據(jù)庫。
???????【如果此時進行數(shù)據(jù)的寫入操作,會發(fā)生錯誤】
??(4)?FlushMode.ALWAYS:在每一個查詢數(shù)據(jù)之前都調(diào)用Session.flush()。很顯然這種效率很低。
??
?在調(diào)用Session.flush()時,涉及的SQL語句會按照下面的順序執(zhí)行。
(1)???????? 所有的實體進行插入的語句,其順序按照對象執(zhí)行Session.save()的時間順序。
(2)???????? 所有對實體進行更新的語句
(3)???????? 所有對集合元素進行刪除,更新或者插入的語句
(4)???????? 所有對實體經(jīng)行刪除的語句,其順序按照對象執(zhí)行Session.delete()的時間順序。
(5)???????? 有一個例外是,如果對象使用native方式生成的ID(持久化標(biāo)識),則他們一執(zhí)行save就會被插入。
???????????????? 【因為native方式若想得到主鍵,必須與數(shù)據(jù)庫交互,而hilo方式則不用】)
轉(zhuǎn)載于:https://my.oschina.net/pangzhuzhu/blog/318160
總結(jié)
以上是生活随笔為你收集整理的Hibernate Session的Flush模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MVC 表单验证
- 下一篇: Activity和ListActivit