亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

ResultSet 實現 - 它是在調用 next() 時獲取的,還是結果已經在內存中?

ResultSet 實現 - 它是在調用 next() 時獲取的,還是結果已經在內存中?

偶然的你 2022-07-27 19:57:18
假設我必須瀏覽所有條目。有誰知道如何獲取 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行。


查看完整回答
反對 回復 2022-07-27
?
慕田峪7331174

TA貢獻1828條經驗 獲得超13個贊

取決于數據庫引擎和 JDBC 驅動程序。通常,JDBC API 背后的想法是數據庫引擎創建一個游標(這也是為什么 ResultSet 是必須關閉的資源的原因),因此,您可以在SELECT * FROM someTableWithBillionsOfRows沒有 a 的情況下執行 a LIMIT,但它可以很快。

是否真的如此,好吧,這取決于。根據我的經驗,它主要與 postgres 交互,它很快(例如,基于游標的數據從 DB 到 VM 的傳輸有限,即使查詢匹配數十億行),因此你的計劃(無限制選擇,繼續調用接下來直到你有你想要的然后關閉結果集)應該可以正常工作。

NB:一些數據庫引擎半途而廢并批量傳輸結果,兩全其美:延遲開銷是有限的(單個延遲開銷由批量結果共享),但 DB 和 VM 之間的總傳輸僅限于rowsize 乘以 batchsize,即使您只讀取一行然后關閉結果集。


查看完整回答
反對 回復 2022-07-27
  • 2 回答
  • 0 關注
  • 190 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號