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

Cerrar un conjunto de resultados de transmisión (usando mysql jdbc) lleva mucho tiempo

Entonces, como publiqué en mi comentario a la pregunta, la respuesta oficial del conector MySQL es que debe transmitir todo el conjunto de resultados para que se cierre (http://dev.mysql.com/doc/refman/5.5/en/connector-j- notas-de-implementación-de-referencia.html ). Además, no puede realizar más consultas mientras se produce un resultado de transmisión.

Como un truco completamente repugnante, usé la reflexión para bajar a RowDataDynamic (ver. 5.1.24) y simular una excepción interrumpida, así:

    final Class<?> rdClass = rd.getClass();
    final Field isInterruptedField = rdClass.getDeclaredField("isInterrupted");
    isInterruptedField.setAccessible(true);  // override 'protected' visibility
    isInterruptedField.set(rd, true);

Tenga en cuenta que tendrá que caminar por cualquier objeto que tenga controlado para llegar al ResultSet. Para mí, estaba usando la clase ScrollableResults de Hibernate. Esto significó obtener la referencia de ResultSet de él (su súper clase, en realidad), luego RowData desde allí.

Esto permitirá que se lleve a cabo la operación de cierre sin transmitir el resto de los resultados SIN EMBARGO Obtengo una excepción debido a que el tamaño del paquete no coincide cuando intento revertir la transacción (que simplemente atrapo e ignoro). Al usar Atomikos como grupo de conexiones, veré advertencias sobre las próximas conexiones a medida que se limpien las cosas, pero todo seguirá funcionando correctamente.

Claramente, este enfoque puede no funcionar para todos, pero al menos es una solución alternativa cuando se realiza el procesamiento a través de la consulta de la base de datos o cuando se escribe una lógica más complicada para recuperar los resultados en lotes, simplemente no funcionará.