使用MySQL流式传输大结果集 Streaming large result sets with MySQL
使用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