假設我必須瀏覽所有條目。有誰知道如何獲取 ResultSet 的結果?我可以調用SELECT * FROM MyTable而不是SELECT TOP 100 * FROM MyTable ORDER BY id ASC OFFSET 0;調用,只是resultSet.next()根據需要調用來獲取結果,并在程序級別處理它們,還是結果已經在內存中而不是放入TOP是不好的?
2 回答

繁星點點滴滴
TA貢獻1803條經驗 獲得超3個贊
該類ResultSet
公開了一個
void setFetchSize(int rows)
方法,根據JavaDoc
ResultSet
當此對象需要更多行時,向 JDBC 驅動程序提供有關應從數據庫中獲取的行數的提示。
這意味著如果我們有一個200
來自數據庫的行結果集,并且我們將 fetch size 設置為100
,~100
則一次將從數據庫加載行,并且可能需要兩次訪問數據庫。
默認提取大小取決于驅動程序,但例如,Oracle
將其設置為10
行。

慕田峪7331174
TA貢獻1828條經驗 獲得超13個贊
取決于數據庫引擎和 JDBC 驅動程序。通常,JDBC API 背后的想法是數據庫引擎創建一個游標(這也是為什么 ResultSet 是必須關閉的資源的原因),因此,您可以在SELECT * FROM someTableWithBillionsOfRows
沒有 a 的情況下執行 a LIMIT
,但它可以很快。
是否真的如此,好吧,這取決于。根據我的經驗,它主要與 postgres 交互,它很快(例如,基于游標的數據從 DB 到 VM 的傳輸有限,即使查詢匹配數十億行),因此你的計劃(無限制選擇,繼續調用接下來直到你有你想要的然后關閉結果集)應該可以正常工作。
NB:一些數據庫引擎半途而廢并批量傳輸結果,兩全其美:延遲開銷是有限的(單個延遲開銷由批量結果共享),但 DB 和 VM 之間的總傳輸僅限于rowsize 乘以 batchsize,即使您只讀取一行然后關閉結果集。
添加回答
舉報
0/150
提交
取消