Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Das Schließen eines Streaming-Ergebnissatzes (mit mysql jdbc) dauert lange

Wie in meinem Kommentar zu der Frage gepostet, lautet die offizielle Antwort des MySQL-Connectors, dass Sie die gesamte Ergebnismenge streamen müssen, damit sie geschlossen wird (http://dev.mysql.com/doc/refman/5.5/en/connector-j- Referenz-Implementierungshinweise.html ). Außerdem können Sie keine weiteren Abfragen durchführen, während ein Streaming-Ergebnis stattfindet.

Als völlig ekelhafter Hack habe ich Reflektion verwendet, um zu RowDataDynamic zu gelangen (Version 5.1.24) und eine unterbrochene Ausnahme vortäuschen, etwa so:

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

Beachten Sie, dass Sie jedes Objekt, auf das Sie ein Handle haben, nach unten gehen müssen, um zum ResultSet zu gelangen. Für mich habe ich die ScrollableResults-Klasse von Hibernate verwendet. Das bedeutete, von ihm eine ResultSet-Referenz (eigentlich seine Superklasse) und dann RowData von dort zu bekommen.

Dadurch kann der Schließvorgang ausgeführt werden, ohne dass der Rest der Ergebnisse JEDOCH gestreamt wird Ich erhalte eine Ausnahme aufgrund einer nicht übereinstimmenden Paketgröße, wenn ich versuche, die Transaktion rückgängig zu machen (die ich einfach abfange und ignoriere). Wenn ich Atomikos als Verbindungspool verwende, sehe ich Warnungen zu den nächsten paar Verbindungen, wenn die Dinge bereinigt werden, aber alles funktioniert immer noch gut.

Natürlich funktioniert dieser Ansatz nicht für alle, aber es ist zumindest eine Problemumgehung, wenn die Verarbeitung über die Datenbankabfrage erfolgt oder eine kompliziertere Logik geschrieben wird, um Ergebnisse in Stapeln abzurufen, einfach nicht funktioniert.