2013-10-04 53 views
7

我使用hibernate標準API來檢索數據。這些數據只會由用戶查看。用戶不能修改這些數據。那麼,使用readOnly有沒有什麼好處?你可以建議專業&缺點?還有其他的方法需要考慮嗎?在休眠標準中使用readOnly是否有任何性能優勢?

Read-only entities

+0

您是否在談論分離或受管實例?它是一個分層架構的Web應用程序嗎?當你說用戶是指你的開發人員將使用你的API來訪問數據或你的應用程序的普通非技術用戶(與視圖層交互)? – Thihara

回答

11

休眠跟蹤的會話中加載找到的修改,當你刷新會議堅持所有更改的所有對象。如果將實體加載爲只讀,則指示Hibernate不要跟蹤該實體以進行更改。這樣,你會得到一些性能增加。

但是,該對象將保留在會話緩存中。如果緩存過大,則會成爲一個嚴重的問題,並且可能會導致內存不足。如果你讀了很多東西,那麼驅逐它們是件好事。

如果Hibernate的性能確實是一個問題,那麼切換到純JDBC是更好的選擇。我從不使用Hibernate來加載大量數據(例如報表或批處理)。爲了顯示列表,我只加載我需要的字段,而不是整個實體(如果你只讀取選擇的字段,而不是整個實體,它們總是隻讀的)。

所以答案是,,它會讓Hibernate更快一些,但還有其他方法可以獲得更高的性能。

+0

我正在使用帶有休眠功能的數據庫視圖來顯示帶有必需字段的列表。只讀對象是否總是停留在緩存中?沒有被驅逐嗎? – nayakam

2

使用只讀實體更像是一個意圖的表達。通過使用只讀hibernate不會檢查實體是否已經改變,即使它已經改變。這與被標記爲不可變的實體不同,因爲這些實體不受變化的影響。如果Hibernate檢測到一個不可變的實體對象的屬性發生了變化,但是隻讀實體沒有發生變化,Hibernate將會出錯。

因此,使一個實體只讀通知休眠,你不希望更改持久。這也可能不適用於相關收藏。

除非您有特殊要求或做特別昂貴的骯髒檢查,否則性能增益最低。

所以它不是關於性能。這是一種安全措施,可以保護數據庫免遭意外更改。

例如,您有一個描述地理位置的位置實體。現在你有一個人併爲其分配一個位置。當使用人員協會加載位置時,即使您的同事(或您自己)意外更改了位置,您也可以使位置只讀。更改將不會被存儲,但對Person實體的更改仍然存在。 (可能最好將位置標記爲不可變但存在這些罕見情況,這是不夠的。)