3 回答

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

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