sql >> Database >  >> RDS >> Mysql

Het sluiten van een streamingresultatenset (met mysql jdbc) duurt lang

Dus zoals gepost in mijn commentaar op de vraag, is het officiële antwoord van de MySQL-connector dat je alle resultatenset moet streamen om te sluiten (http://dev.mysql.com/doc/refman/5.5/en/connector-j- reference-implementation-notes.html ). Bovendien kunt u geen query's meer uitvoeren terwijl een streamingresultaat plaatsvindt.

Als een compleet walgelijke hack gebruikte ik reflectie om naar RowDataDynamic te gaan (ver. 5.1.24) en nep een onderbroken uitzondering, zoals zo:

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

Let op, je moet naar beneden lopen welk object je ook hebt om bij de ResultSet te komen. Voor mij gebruikte ik de ScrollableResults-klasse van Hibernate. Dit betekende dat je er een ResultSet-referentie van moest krijgen (eigenlijk zijn superklasse), en daarna RowData.

Hierdoor kan de afsluiting plaatsvinden zonder de rest van de resultaten te streamen ECHTER Ik krijg een uitzondering vanwege een niet-overeenkomende pakketgrootte wanneer ik de transactie probeer terug te draaien (die ik gewoon opvang en negeer). Als ik Atomikos als verbindingspool gebruik, zie ik waarschuwingen over de volgende paar verbindingen als de zaken worden opgeruimd, maar alles werkt nog steeds goed.

Het is duidelijk dat deze aanpak niet voor iedereen werkt, maar het is in ieder geval een tijdelijke oplossing wanneer de verwerking via de databasequery of het schrijven van meer gecompliceerde logica om resultaten in batches op te halen, gewoon niet werkt.




  1. Gebruik COLUMNPROPERTY() om kolom- of parameterinformatie in SQL Server te retourneren

  2. MySQL - Hoe meerdere update-query's op één regel uitvoeren?

  3. Voer sp_msforeachdb uit in een Java-toepassing

  4. Karaktergegevens gaan niet van php naar jQuery