簡體   English   中英

MySQL數據庫的ResultSet行為,它是否將所有行存儲在內存中?

[英]ResultSet behavior with MySQL database, does it store all rows in memory?

從選擇查詢返回結果時,ResultSet是否將所有行存儲在內存中? 還是僅獲取有限數量的行? 各個數據庫是否不同? MYSQL的行為是什么?

默認情況下,MySQL JDBC驅動程序嘗試獲取Java內存中的所有內容。 因此,如果您要處理大量的行和/或很少的內存,則需要告訴它不要這樣做。 這在其JDBC驅動程序文檔中進行了詳細描述。 這是相關的摘錄:

結果集

默認情況下,完全檢索結果集並將其存儲在內存中。 在大多數情況下,這是最有效的操作方式,而且由於MySQL網絡協議的設計更易於實現。 如果您正在使用具有大量行或較大值的ResultSet,並且無法在JVM中為所需的內存分配堆空間,則可以告訴驅動程序一次將結果流回一行。

要啟用此功能,您需要通過以下方式創建一個Statement實例:

 stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY); stmt.setFetchSize(Integer.MIN_VALUE); 

前向只讀結果集與訪存大小為Integer.MIN_VALUE用作驅動程序發出信號以逐行流式傳輸結果集的信號。 此后,將使用該語句創建的任何結果集逐行檢索。

這種方法有一些警告。 您必須先讀取(或關閉)結果集中的所有行,然后才能對連接發出任何其他查詢,否則將引發異常。

對於其他數據庫(請閱讀:其他JDBC驅動程序),您必須查閱其文檔。

ResultSet不會存儲所有行,而是使游標在數據庫上保持打開狀態。

一次獲取的確切數據量取決於驅動程序(因此,每個數據庫的確存在差異)。

如果大小不是很大,結果集可能會存儲所有數據。 這取決於獲取的大小。 ResultSet setFetchSize只是一個提示,但是它取決於底層的JDBC驅動程序來尊重該提示。 就我所知,oracle jdbc驅動程序確實尊重提示。

通常,未指定此名稱,因此可能取決於數據庫(和JDBC驅動程序)。

始終將所有行都保存在內存中的JDBC實現會產生很大的結果問題,而單獨獲取每行的實現則性能很差(至少,如果數據庫位於遠程位置)。

因此,大多數實現都以與實現相關的某些大小的塊來獲取數據。 我不知道任何MySQL JDBC驅動程序會做什么。

暫無
暫無

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

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