2015-02-07 51 views
2

我不明白hibernate session.flush()是如何工作的。在grails中,它何時被自動調用,它是如何決定什麼時候刷新的最佳時機?如果用戶做了一些需要數千個查詢的操作,會在他的會話結束時運行?乘以千位用戶。Hibernate何時以及如何刷新其會話?

任何你可以分享的東西解釋了在grails中的休眠會話?謝謝

回答

2

Grails遵循處理Hibernate會話和自動刷新的「Open session in view」模式。

在您的例子,如果你不顯式調用.flush()上的會話或使用flush: true修改數據時,它實際上將刷新爲用戶會話中的所有查詢當線程開始會話結束(通常在一月底基於Web的Grails應用程序中的HTTP請求)。

根據您的應用程序,定期刷新會話可能有意義。同樣,這在很大程度上取決於您的應用程序以及單個用戶請求會影響多少數據。頻繁沖洗也會導致性能下降。

如果您關心的是性能,只有一種真正的方法來確定最佳方法。使用各種方法分析您的應用程序,並查看哪些適合您的應用程序

關於這個話題的Grails documentation發現一些額外的信息:

休眠超過直接JDBC調用,甚至其他 框架一個非常有用的功能是,當你調用保存或刪除它不 一定執行任何SQL操作。休眠 批處理SQL語句並儘可能晚地執行它們,通常在請求結束時執行 ,當刷新和關閉會話時。這個 通常由Grails自動完成,它管理你的Hibernate會話。

Hibernate的緩存數據庫更新在可能情況下,實際上只 推變化時,它知道沖水需要,或當 沖洗被編程觸發。休眠 將刷新高速緩存更新的一個常見情況是執行查詢時,因爲高速緩存的 信息可能包含在查詢結果中。但只要 您正在進行無衝突的保存,更新和刪除操作,它們將批量處理爲 ,直到會話刷新爲止。對於執行大量數據庫寫入的應用程序,這可能是一個重要的性能提升。

請注意,刷新與提交交易不同。如果 您的操作是在事務上下文中執行的,則刷新 將執行SQL更新,但數據庫會將更改保存在其 事務隊列中,並且僅在事務 提交時完成更新。

相關問題