簡體   English   中英

resultSet.next()做什么

[英]What does resultSet.next() do

我有一個簡單的問題。 如果我的過程返回500行,那么在第1行中我的結果集有500行。 這意味着現在所有記錄都存在於此結果集對象中。 我對么 ?

如果rs.next迭代需要時間,這意味着它與存儲過程性能無關,因為我們已經在Java端獲得了包含所有500條記錄的結果集對象。 我對么 ?

rs = (ResultSet)callableStatement.getObject(1);
logger.debug("Iterating ResultSet Starts");
Bean bean = null;
while(rs.next()) {
    logger.debug(“some logic but commented to check performance”);     
}

CallableStatement和ResultSet都具有獲取大小,該大小決定了在迭代結果集時從游標中一次檢索到多少行。 默認情況下,您沒有獲得所有500行,您獲得的行數達到了驅動程序的提取大小。 根據此Oracle JDBC文檔, Oracle的默認提取大小要低得多:

默認情況下,當Oracle JDBC執行查詢時,它一次從數據庫游標接收結果集10行。 這是默認的Oracle行預取值。 您可以通過更改行預取值來更改每次訪問數據庫游標時檢索的行數(有關詳細信息,請參閱“Oracle行預取”)。

JDBC 2.0還允許您指定查詢每次數據庫往返時獲取的行數,此數字稱為獲取大小。 在Oracle JDBC中,行預取值用作語句對象中的缺省提取大小。 設置提取大小會覆蓋row-prefetch設置,並影響通過該語句對象執行的后續查詢。

獲取大小也用於結果集。 當語句對象執行查詢時,語句對象的提取大小將傳遞給查詢生成的結果集對象。 但是,您還可以在結果集對象中設置提取大小,以覆蓋傳遞給它的語句提取大小。 (另請注意,在生成結果集之后對語句對象的提取大小所做的更改將不會影響該結果集。)

默認設置為10,您的代碼將進行50次往返,以從過程調用中獲取所有數據。 (這個文檔已經很老了 - 它討論的是JDBC 2.0,好像它是新的 - 所以它可能已經過時了,你應該檢查你的fetch大小設置為什么。)更改獲取大小以便取回所有這些行應該最大限度地減少網絡中的行程開銷。

這意味着現在所有記錄都存在於此結果集對象中。 我對么 ?

通常這是不正確的。 ResultSet通常是數據庫游標的抽象,當調用next時,它將根據需要獲取結果集的記錄。

只有在某些特殊情況下,您才能獲得所謂的“客戶端游標”,這意味着所有數據都已提前復制到您的身邊。 這是一種不合需要的行為,並且是JDBC規范要求數據庫本身不支持的情況的解決方法。

暫無
暫無

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

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