第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

使用MySQL流式傳輸大型結(jié)果集

使用MySQL流式傳輸大型結(jié)果集

絕地?zé)o雙 2019-11-28 10:10:22
我正在開發(fā)一個使用大型MySQL表的spring應(yīng)用程序。加載大表時,我得到一個OutOfMemoryException,因為驅(qū)動程序試圖將整個表加載到應(yīng)用程序內(nèi)存中。我嘗試使用statement.setFetchSize(Integer.MIN_VALUE);但是然后我打開的每個ResultSet都掛了close(); 在網(wǎng)上查找時,我發(fā)現(xiàn)發(fā)生這種情況是因為它嘗試在關(guān)閉ResultSet之前嘗試加載所有未讀的行,但事實并非如此,因為我這樣做是:ResultSet existingRecords = getTableData(tablename);try {    while (existingRecords.next()) {        // ...    }} finally {    existingRecords.close(); // this line is hanging, and there was no exception in the try clause}小表(3行)也會發(fā)生掛起,如果我不關(guān)閉RecordSet(在一種方法中發(fā)生),則會connection.close()掛起。掛起的堆棧跟蹤:SocketInputStream.socketRead0(FileDescriptor,byte [],int,int,int)行:不可用[本機方法]SocketInputStream.read(byte [],int,int)行:129ReadAheadInputStream.fill(int)行:113ReadAheadInputStream。 readFromUnderlyingStreamIfNecessary(byte [],int,int)行:160ReadAheadInputStream.read(byte [],int,int)行:188MysqlIO.readFully(InputStream,byte [],int,int)行:2428 MysqlIO.reuseAndReadPacket(Buffer ,int)行:2882MysqlIO.reuseAndReadPacket(Buffer)行:2871MysqlIO.checkErrorPacket(int)行:3414MysqlIO.checkErrorPacket()行:910MysqlIO.nextRow(Field [],int,boolean,int,boolean,boolean,布爾值,緩沖區(qū))行:1405RowDataDynamic.nextRecord()行:413RowDataDynamic.next()行:392 RowDataDynamic.close()行:170JDBC4ResultSet(ResultSetImpl).realClose(boolean)行:7473 JDBC4ResultSet(ResultSetImpl).close()行:881 DelegatingResultSet.close ()行:152DelegatingResultSet.close()行:152DelegatingPreparedStatement(DelegatingStatement).close()行:163(這是我的課程)Database.close()行:84
查看完整描述

3 回答

?
qq_花開花謝_0

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)回答了類似的問題。


查看完整回答
反對 回復(fù) 2019-11-28
?
智慧大石

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)在問題已解決。


查看完整回答
反對 回復(fù) 2019-11-28
  • 3 回答
  • 0 關(guān)注
  • 1137 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號