使用MySQL流式传输大结果集 Streaming large result sets with MySQL

10 浏览
0 Comments

使用MySQL流式传输大结果集 Streaming large result sets with MySQL

我正在开发一个使用大型MySQL表的Spring应用程序。当加载大型表时,我会遇到一个OutOfMemoryException异常,因为驱动程序试图将整个表加载到应用程序内存中。

我尝试使用statement.setFetchSize(Integer.MIN_VALUE);,但是每次我打开的ResultSet都在close()上挂起;在网上找到的信息显示,这是因为它在关闭ResultSet之前尝试加载任何未读的行,但这并不是我的情况,因为我这样做:

ResultSet existingRecords = getTableData(tablename);
try {
    while (existingRecords.next()) {
        // ...
    }
} finally {
    existingRecords.close(); // 这一行挂起,并且try子句中没有异常
}

这种挂起的情况也发生在小表(3行)上,如果我不关闭RecordSet(在一个方法中发生过),那么connection.close()也会挂起。


挂起的堆栈跟踪:

SocketInputStream.socketRead0(FileDescriptor, byte[], int, int, int)行:不可用[本机方法]

SocketInputStream.read(byte[], int, int)行:129

ReadAheadInputStream.fill(int)行:113

ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(byte[], int, int)行:160

ReadAheadInputStream.read(byte[], int, int)行:188

MysqlIO.readFully(InputStream, byte[], int, int)行:2428

MysqlIO.reuseAndReadPacket(Buffer, int)行:2882

MysqlIO.reuseAndReadPacket(Buffer)行:2871

MysqlIO.checkErrorPacket(int)行:3414

MysqlIO.checkErrorPacket()行:910

MysqlIO.nextRow(Field[], int, boolean, int, boolean, boolean, boolean, Buffer)行:1405

RowDataDynamic.nextRecord()行:413

RowDataDynamic.next()行:392

RowDataDynamic.close()行:170

JDBC4ResultSet(ResultSetImpl).realClose(boolean)行:7473

JDBC4ResultSet(ResultSetImpl).close()行:881

DelegatingResultSet.close()行:152

DelegatingResultSet.close()行:152

DelegatingPreparedStatement(DelegatingStatement).close()行:163

(这是我的类)Database.close()行:84

0