3 回答

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超9個(gè)贊
在JDBC中,該setFetchSize(int)
方法對(duì)于JVM中的性能和內(nèi)存管理非常重要,因?yàn)樗刂茝腏VM到數(shù)據(jù)庫的網(wǎng)絡(luò)調(diào)用的數(shù)量,以及相應(yīng)的用于ResultSet處理的RAM量。
本質(zhì)上,如果調(diào)用setFetchSize(10)并且驅(qū)動(dòng)程序忽略它,則可能只有兩個(gè)選項(xiàng):
嘗試使用不同的JDBC驅(qū)動(dòng)程序來支持fetch-size提示。
查看Connection上的驅(qū)動(dòng)程序特定屬性(創(chuàng)建Connection實(shí)例時(shí)的URL和/或?qū)傩杂成洌?/p>
RESULT-SET是響應(yīng)查詢而在DB上編組的行數(shù)。ROW-SET是從JVM到DB的每次調(diào)用從RESULT-SET中取出的行塊。處理所需的這些調(diào)用數(shù)和生成的RAM取決于fetch-size設(shè)置。
因此,如果RESULT-SET有100行且fetch-size為10,那么將有10次網(wǎng)絡(luò)調(diào)用來檢索所有數(shù)據(jù),在任何給定時(shí)間使用大約10 * {row-content-size} RAM。
默認(rèn)的fetch-size是10,相當(dāng)小。在發(fā)布的情況下,似乎驅(qū)動(dòng)程序忽略了fetch-size設(shè)置,在一次調(diào)用中檢索所有數(shù)據(jù)(大RAM要求,最佳最小網(wǎng)絡(luò)調(diào)用)。
下面發(fā)生的ResultSet.next()
是它實(shí)際上并沒有從RESULT-SET一次獲取一行。它從(本地)ROW-SET中獲取它,并在本地客戶端上耗盡時(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)證)。

TA貢獻(xiàn)1934條經(jīng)驗(yàn) 獲得超2個(gè)贊
該fetchSize
參數(shù)是JDBC驅(qū)動(dòng)程序的提示,指示要從數(shù)據(jù)庫中一次獲取的許多行。但是司機(jī)可以自由地忽略這一點(diǎn)并做它認(rèn)為合適的事情。某些驅(qū)動(dòng)程序(如Oracle的驅(qū)動(dòng)程序)以塊的形式獲取行,因此您可以讀取非常大的結(jié)果集而無需大量內(nèi)存。其他驅(qū)動(dòng)程序只需一次讀取整個(gè)結(jié)果集,我猜你的驅(qū)動(dòng)程序正在做什么。
您可以嘗試將驅(qū)動(dòng)程序升級(jí)到SQL Server 2008版本(可能更好)或開源jTDS驅(qū)動(dòng)程序。

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超4個(gè)贊
您需要確保關(guān)閉 Connection上的自動(dòng)提交,否則setFetchSize將不起作用。
dbConnection.setAutoCommit(false);
編輯:記得當(dāng)我使用此修復(fù)程序時(shí)它是Postgres特定的,但希望它仍然適用于SQL Server。
添加回答
舉報(bào)