sql >> Base de Datos >  >> RDS >> Mysql

Streaming de grandes conjuntos de resultados con MySQL

Establecer solo el tamaño de recuperación no es el enfoque correcto. El javadoc de Statement#setFetchSize() ya dice lo siguiente:

Le da al controlador JDBC una pista en cuanto a la cantidad de filas que deben obtenerse de la base de datos

El conductor es realmente libre de aplicar o ignorar la sugerencia. Algunos controladores lo ignoran, algunos controladores lo aplican directamente, algunos controladores necesitan más parámetros. El controlador MySQL JDBC cae en la última categoría. Si marca el controlador MySQL JDBC documentación , verá la siguiente información (desplácese unos 2/3 hacia abajo hasta el encabezado ResultSet ):

Para habilitar esta funcionalidad, debe crear una instancia de Declaración de la siguiente manera:

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);

Lea totalmente sección del documento, también describe las advertencias de este enfoque. Aquí hay una cita relevante:

Hay algunas advertencias con este enfoque. Tendrá que leer todas las filas del conjunto de resultados (o cerrarlo) antes de poder realizar otras consultas sobre la conexión, o se lanzará una excepción.

(...)

Si la declaración está dentro del alcance de una transacción, los bloqueos se liberan cuando se completa la transacción (lo que implica que la declaración debe completarse primero). Al igual que con la mayoría de las otras bases de datos, las declaraciones no están completas hasta que se leen todos los resultados pendientes en la declaración o se cierra el conjunto de resultados activo para la declaración.

Si eso no soluciona el OutOfMemoryError (no Exception ), entonces es probable que el problema esté almacenando todos los datos en la memoria de Java en lugar de procesarlos inmediatamente tan pronto como ingresen los datos. Esto requeriría más cambios en su código, tal vez una reescritura completa. He respondido una pregunta similar antes aquí .