Mysql
 sql >> Database >  >> RDS >> Mysql

La chiusura di un set di risultati di streaming (usando mysql jdbc) richiede molto tempo

Quindi, come pubblicato nel mio commento alla domanda, la risposta ufficiale dal connettore MySQL è che devi eseguire lo streaming di tutto il set di risultati affinché si chiuda (http://dev.mysql.com/doc/refman/5.5/en/connector-j- reference-implementation-notes.html ). Inoltre, non puoi eseguire altre query mentre è in corso un risultato di streaming.

Come hack completamente disgustoso, ho usato la riflessione per scendere in RowDataDynamic (ver. 5.1.24) e simulare un'eccezione interrotta, in questo modo:

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

Nota, dovrai scendere qualsiasi oggetto su cui hai un handle per arrivare a ResultSet. Per me, stavo usando la classe ScrollableResults di Hibernate. Ciò significava ottenere il riferimento ResultSet da esso (la sua super classe, in realtà), quindi RowData da lì.

Ciò consentirà l'esecuzione dell'operazione di chiusura senza trasmettere in streaming il resto dei risultati COMUNQUE Ottengo un'eccezione a causa della dimensione del pacchetto non corrispondente quando provo a ripristinare la transazione (che catturo e ignoro). Utilizzando Atomikos come pool di connessioni, vedrò avvisi sulle prossime connessioni man mano che le cose verranno ripulite, ma tutto funziona ancora bene.

Chiaramente questo approccio potrebbe non funzionare per tutti, ma almeno è una soluzione alternativa quando l'elaborazione tramite la query del database o la scrittura di una logica più complicata per recuperare i risultati in batch non funzionerà.