Jak je tedy uvedeno v mém komentáři k otázce, oficiální odpovědí z konektoru MySQL je, že musíte vysílat celou sadu výsledků, aby se zavřela (http://dev.mysql.com/doc/refman/5.5/en/connector-j- reference-implementation-notes.html ). Kromě toho nemůžete provádět žádné další dotazy, když probíhá výsledek streamování.
Jako úplně nechutný hack jsem použil reflexi, abych se dostal dolů do RowDataDynamic (ver. 5.1.24) a předstírat přerušenou výjimku, například takto:
final Class<?> rdClass = rd.getClass();
final Field isInterruptedField = rdClass.getDeclaredField("isInterrupted");
isInterruptedField.setAccessible(true); // override 'protected' visibility
isInterruptedField.set(rd, true);
Všimněte si, že budete muset sejít dolů po jakémkoli objektu, na kterém máte rukojeť, abyste se dostali k ResultSet. Pro mě jsem používal třídu ScrollableResults Hibernate. To znamenalo získat z něj referenci ResultSet (vlastně jeho super třídu) a odtud RowData.
To umožní, aby operace uzavření proběhla bez streamování zbytku výsledků VŠAK Dostanu výjimku kvůli neshodné velikosti paketu, když se pokusím vrátit zpět transakci (kterou jsem prostě zachytil a ignoroval). Při použití Atomikos jako fondu připojení se mi budou zobrazovat upozornění na několik dalších připojení, jak se věci vyčistí, ale vše stále funguje v pořádku.
Je zřejmé, že tento přístup nemusí fungovat pro každého, ale alespoň je to řešení, když zpracování pomocí databázového dotazu nebo psaní složitější logiky pro získání výsledků v dávkách prostě nebude fungovat.