sql >> Databasteknik >  >> RDS >> Mysql

Att stänga en strömmande resultatuppsättning (med mysql jdbc) tar lång tid

Så som jag skrev i min kommentar till frågan är det officiella svaret från MySQL-anslutningen att du måste strömma hela resultatuppsättningen för att den ska stängas (http://dev.mysql.com/doc/refman/5.5/en/connector-j- reference-implementation-notes.html ). Dessutom kan du inte utföra fler frågor medan ett streamingresultat pågår.

Som ett helt äckligt hack använde jag reflektion för att gå ner i RowDataDynamic (ver. 5.1.24) och fejka ett avbrutet undantag, som så:

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

Observera att du måste gå ner vilket föremål du än har ett handtag på för att komma till ResultSet. För mig använde jag Hibernates klass ScrollableResults. Detta innebar att man hämtade ResultSet-referens från den (dess superklass faktiskt), sedan RowData därifrån.

Detta kommer att tillåta stängningsoperationen att äga rum utan att strömma resten av resultaten ÄVEN Jag får ett undantag på grund av att paketstorleken inte matchar när jag försöker återställa transaktionen (som jag bara fångar och ignorerar). Genom att använda Atomikos som anslutningspool kommer jag att se varningar om de kommande anslutningarna när saker och ting städas upp, men allt fungerar fortfarande ok.

Det här tillvägagångssättet kanske inte fungerar för alla, men det är åtminstone en lösning när man gör bearbetningen via databasfrågan eller skriver mer komplicerad logik för att hämta resultat i partier helt enkelt inte fungerar.




  1. Enklaste sättet att bygga ett träd från en lista över förfäder

  2. 12c Autofyller kolumn med sekvensvärde

  3. SQL-fråga för att skapa databas i MySQL

  4. Kapslade loopar och Performance Spools