簡體   English   中英

JDBC / Hibernate獲取大小和內存問題

[英]JDBC/Hibernate Fetch Size and memory issues

在研究了一下工作之后,我注意到我正在使用的應用程序正在使用默認的提取大小(根據我所知,Oracle為10)。 問題在於,在大多數情況下,用戶獲取大量數據(范圍從幾千到甚至幾十萬),而默認的10確實是一個巨大的瓶頸。

因此,這里明顯的結論是使獲取大小更大。 起初我正在考慮將默認值設置為100並將其提升為1000以進行多次查詢。 但后來我在網上讀到默認值太小以防止內存問題(即當JVM堆無法處理如此多的數據時),我應該擔心嗎?

我還沒有看到任何進一步的解釋。 是否意味着更大的提取大小意味着在獲取結果集時會產生更多開銷? 或者它們只是意味着默認情況下我可以獲取10條記錄然后GC它們並獲取另外10條等等(而假設一次獲取10000條會導致OutOfMemory異常)? 在這種情況下,我真的不在乎,因為我需要記憶中的所有記錄。 在前一種情況下(更大的結果集意味着更大的內存開銷)我想我應該先加載測試它。

通過設置獲取大小,您可能OutOfMemoryError 風險。

無論如何你需要所有這些記錄的事實可能是不合理的。 您需要更多機會需要返回的ResultSet反映的實體 ...將獲取大小設置為10000意味着您正在堆積由JDBC類表示的10000條記錄。 當然,您不會通過您的應用程序傳遞這些內容。 您首先將它們轉換為您最喜歡的業務邏輯實體,然后將它們交給您的業務邏輯執行器。 這樣,只要JDBC獲取下一個獲取批量,就會為GC提供第一個獲取批量的記錄。

通常,由於前面提到的內存威脅,這種轉換一次完成一小部分。

但有一件事你是絕對正確的:你應該在調整之前測試具有明確要求的性能。

因此,這里明顯的結論是使獲取大小更大。

也許一個同樣明顯的結論應該是:“讓我們看看我們是否可以減少用戶帶回來的對象數量。” 當Google返回結果時,它會以25或50的批次進行分類,最大可能被您視為有用。 如果您的用戶帶回了數千個對象,也許您需要考慮如何減少這些對象。 數據庫可以做更多的工作嗎? 是否有其他操作可以編寫以消除其中的一些對象? 物體本身能更聰明嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM