Jadi seperti yang diposting dalam komentar saya untuk pertanyaan itu, jawaban resmi dari konektor MySQL adalah Anda harus mengalirkan semua hasil yang ditetapkan agar dapat ditutup (http://dev.mysql.com/doc/refman/5.5/en/connector-j- reference-implementation-notes.html ). Selain itu, Anda tidak dapat melakukan kueri lagi saat hasil streaming berlangsung.
Sebagai peretasan yang benar-benar menjijikkan, saya menggunakan refleksi untuk masuk ke RowDataDynamic (ver. 5.1.24) dan memalsukan pengecualian yang terputus, seperti:
final Class<?> rdClass = rd.getClass();
final Field isInterruptedField = rdClass.getDeclaredField("isInterrupted");
isInterruptedField.setAccessible(true); // override 'protected' visibility
isInterruptedField.set(rd, true);
Catatan, Anda harus berjalan menyusuri objek apa pun yang Anda pegang untuk sampai ke ResultSet. Bagi saya, saya menggunakan kelas ScrollableResults Hibernate. Ini berarti mendapatkan referensi ResultSet darinya (kelas supernya, sebenarnya), lalu RowData dari sana.
Ini akan memungkinkan operasi penutupan berlangsung tanpa streaming sisa hasil NAMUN Saya mendapatkan pengecualian karena ukuran paket yang tidak cocok ketika saya mencoba untuk mengembalikan transaksi (yang baru saja saya tangkap dan abaikan). Menggunakan Atomikos sebagai kumpulan koneksi, saya akan melihat peringatan tentang beberapa koneksi berikutnya saat semuanya dibersihkan, tetapi semuanya masih berfungsi dengan baik.
Jelas pendekatan ini mungkin tidak bekerja untuk semua orang, tetapi setidaknya ini solusi ketika melakukan pemrosesan melalui kueri basis data atau menulis logika yang lebih rumit untuk mengambil hasil dalam kumpulan tidak akan berhasil.