在 JDBC 中,setFetchSize(int)
方法對(duì)于 JVM 內(nèi)的性能和內(nèi)存管理非常重要,因?yàn)樗刂茝?JVM 到數(shù)據(jù)庫的網(wǎng)絡(luò)調(diào)用數(shù)量以及相應(yīng)的數(shù)據(jù)量。用于結(jié)果集處理的 RAM。
本質(zhì)上,如果調(diào)用 setFetchSize(10) 并且驅(qū)動(dòng)程序忽略它,則可能只有兩個(gè)選項(xiàng):
RESULT-SET 是為響應(yīng)查詢而在數(shù)據(jù)庫上編組的行數(shù)。 ROW-SET 是每次從 JVM 調(diào)用到 DB 時(shí)從 RESULT-SET 中提取的行塊。 這些調(diào)用的數(shù)量以及處理所需的 RAM 取決于 fetch-size 設(shè)置。
因此,如果 RESULT-SET 有 100 行并且 fetch-size 為 10, 在任何給定時(shí)間,都會(huì)有 10 個(gè)網(wǎng)絡(luò)調(diào)用來檢索所有數(shù)據(jù),使用大約 10*{row-content-size} RAM。
默認(rèn)的 fetch-size 是 10,這個(gè)值相當(dāng)小。 在發(fā)布的案例中,驅(qū)動(dòng)程序似乎忽略了獲取大小設(shè)置,在一次調(diào)用中檢索所有數(shù)據(jù)(需要大量 RAM,最佳最小網(wǎng)絡(luò)調(diào)用)。
在 ResultSet.next()
下發(fā)生的情況是,它實(shí)際上并沒有從 RESULT-SET 中一次獲取一行。它從(本地)ROW-SET 獲取該數(shù)據(jù),并在本地客戶端上的數(shù)據(jù)耗盡時(shí)從服務(wù)器獲取下一個(gè) ROW-SET(不可見)。
所有這些都取決于驅(qū)動(dòng)程序,因?yàn)樵O(shè)置只是一個(gè)“提示”,但在實(shí)踐中我發(fā)現(xiàn)這就是許多驅(qū)動(dòng)程序和數(shù)據(jù)庫的工作原理(在許多版本的 Oracle、DB2 和 MySQL 中得到驗(yàn)證)。 p>