Estoy desarrollando una aplicación de primavera que utiliza grandes tablas de MySQL. Al cargar tablas grandes, obtengo un OutOfMemoryException
, ya que el controlador intenta cargar toda la tabla en la memoria de la aplicación.Transmisión de grandes conjuntos de resultados con MySQL
He intentado utilizar
statement.setFetchSize(Integer.MIN_VALUE);
pero entonces cada conjunto de resultados abro cuelga en close()
; buscando en línea me encontré con que esto sucede porque se trata de cargar las filas no leídos antes de cerrar el conjunto de resultados, pero ese no es el caso, ya que hago esto:
ResultSet existingRecords = getTableData(tablename);
try {
while (existingRecords.next()) {
// ...
}
} finally {
existingRecords.close(); // this line is hanging, and there was no exception in the try clause
}
Los bloqueos ocurren por pequeñas mesas (3 filas), así, y si no cierro el RecordSet (que sucedió en un método), entonces se bloquea connection.close()
.
Seguimiento de la pila de la caída:
SocketInputStream.socketRead0 (FileDescriptor, byte [], int, int, int) de la línea: no disponible [método nativo]
SocketInputStream.read (byte [], int, int) línea: 129
ReadAheadInputStream.fill (int) línea: 113
ReadAheadInputStream.readFromUnderlyingStreamIfNecessary (byte [], int, int) línea: 160
ReadAheadInputStream.read (byte [], int, int) línea: 188
MysqlIO.readFully (InputStream, byte [], int, int) línea: 2428 MysqlIO.reuseAndReadPacket (Buffer, int) línea: 2882
MysqlIO.reuseAndReadPacket línea (Buffer): 2871
MysqlIO.checkErrorPacket (int) línea: 3414
MysqlIO.checkErrorPacket() de la línea: 910
MysqlIO.nextRow (Field [], int, boolean, int, boolean, boolean, boolean, Buffer) línea: 1405
RowDataDynamic.nextRecord línea(): 413
Línea RowDataDynamic.next(): 392 Línea RowDataDynamic.close(): 170
JDBC4ResultSet (ResultS etImpl) .realClose (boolean) línea: 7473 JDBC4ResultSet (ResultSetImpl) .close() de la línea: 881 DelegatingResultSet.close) línea (: 152
DelegatingResultSet.close() de la línea: 152
DelegatingPreparedStatement (DelegatingStatement) .close () línea: 163
(Esta es mi clase) Database.Close() línea: 84
No creo que el establecimiento MIN_VALUE hace algo útil. ¿Cómo devolverías como máximo -2^31 registros? –
Es algo misterioso. MySQL no admite ese setFetchSize tradicional, por lo que se ignora cualquier valor, excepto Integer.MIN_VALUE, que causa la transmisión correcta. – configurator
¿Dónde está colgando la instrucción close (stack trace)? ¿Qué versión de MySQL está usando y qué controlador JDBC? – jarnbjo