3 回答

TA貢獻1835條經(jīng)驗 獲得超7個贊
僅設(shè)置獲取大小不是正確的方法。的javadocStatement#setFetchSize()已經(jīng)聲明以下內(nèi)容:
向JDBC驅(qū)動程序提示應(yīng)從數(shù)據(jù)庫中獲取的行數(shù)
驅(qū)動程序?qū)嶋H上可以自由地應(yīng)用或忽略提示。一些驅(qū)動程序忽略它,一些驅(qū)動程序直接應(yīng)用它,一些驅(qū)動程序需要更多參數(shù)。MySQL JDBC驅(qū)動程序?qū)儆谧詈笠活?。如果查看MySQL JDBC驅(qū)動程序文檔,將看到以下信息(向下滾動約2/3,直到標(biāo)題ResultSet為止):
要啟用此功能,您需要通過以下方式創(chuàng)建一個Statement實例:
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
請閱讀文檔的整個部分,它也描述了這種方法的注意事項。這是一個相關(guān)的引用:
這種方法有一些警告。您必須先讀?。ɑ蜿P(guān)閉)結(jié)果集中的所有行,然后才能對連接發(fā)出任何其他查詢,否則將引發(fā)異常。
(...)
如果該語句在事務(wù)范圍內(nèi),則在事務(wù)完成時釋放鎖(這意味著該語句需要先完成)。與大多數(shù)其他數(shù)據(jù)庫一樣,在讀取該語句上所有未決的結(jié)果或關(guān)閉該語句的活動結(jié)果集之前,該語句是不完整的。
如果不能解決OutOfMemoryError(not Exception)問題,則可能是您將所有數(shù)據(jù)存儲在Java內(nèi)存中,而不是在數(shù)據(jù)輸入后立即進行處理。這可能需要對代碼進行更多更改,也許完全重寫。在此之前,我已經(jīng)回答了類似的問題。

TA貢獻1946條經(jīng)驗 獲得超3個贊
不要關(guān)閉ResultSet兩次。
顯然,當(dāng)關(guān)閉a時,Statement它嘗試關(guān)閉相應(yīng)的ResultSet,如您在堆棧跟蹤的這兩行中所見:
DelegatingResultSet.close()行:152
DelegatingPreparedStatement(DelegatingStatement).close()行:163
我原以為掛斷電話了,ResultSet.close()但實際上是掛斷Statement.close()電話的地方ResultSet.close()。由于ResultSet已經(jīng)關(guān)閉,因此它剛剛掛起。
我們用替換了所有ResultSet.close(),results.getStatement().close()并刪除了所有Statement.close(),現(xiàn)在問題已解決。
添加回答
舉報