Я разрабатываю приложение spring, которое использует большие таблицы MySQL. При загрузке больших таблиц я получаю OutOfMemoryException
, так как драйвер пытается загрузить всю таблицу в память приложения.
Я попытался использовать
statement.setFetchSize(Integer.MIN_VALUE);
но затем каждый ResultSet, который я открываю, зависает на close()
; я обнаружил, что это происходит, потому что он пытается загрузить любые непрочитанные строки перед закрытием 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 строки), и если я не закрываю RecordSet (что произошло в одном методе), то connection.close()
зависает.
Трассировка стека:
SocketInputStream.socketRead0 (FileDescriptor, byte [], int, int, int) строка: недоступна [native method]
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(буфер): 2871
MysqlIO.checkErrorPacket(int): 3414
MysqlIO.checkErrorPacket(): 910
MysqlIO.nextRow(поле [], int, boolean, int, boolean, boolean, boolean, Buffer): 1405
Строка RowDataDynamic.nextRecord(): 413
Строка RowDataDynamic.next(): 392 Строка RowDataDynamic.close(): 170
JDBC4ResultSet (ResultSetImpl).realClose(логическая) строка: 7473 JDBC4ResultSet (ResultSetImpl).close(): 881 DelegatingResultSet.close(): 152
DelegatingResultSet.close(): 152
DelegatingPreparedStatement (DelegatingStatement).close(): 163
(Это мой класс). Database.close(): 84