Така че, както е публикувано в моя коментар към въпроса, официалният отговор от конектора MySQL е, че трябва да предавате поточно целия набор от резултати, за да се затвори (http://dev.mysql.com/doc/refman/5.5/en/connector-j- референтна-изпълнение-бележки.html ). Освен това не можете да изпълнявате повече заявки, докато се осъществява резултат от поточно предаване.
Като напълно отвратителен хак използвах отражение, за да сляза в RowDataDynamic (версия 5.1.24) и фалшифицира прекъснато изключение, както следва:
final Class<?> rdClass = rd.getClass();
final Field isInterruptedField = rdClass.getDeclaredField("isInterrupted");
isInterruptedField.setAccessible(true); // override 'protected' visibility
isInterruptedField.set(rd, true);
Забележете, че ще трябва да отидете надолу по всеки обект, върху който имате манипулация, за да стигнете до ResultSet. За мен използвах класа ScrollableResults на Hibernate. Това означаваше получаване на препратка към ResultSet от него (всъщност неговия супер клас), а след това RowData от там.
Това ще позволи операцията по затваряне да се осъществи без поточно предаване на останалите резултати ОБАЧЕ Получавам изключение поради несъответстващ размер на пакета, когато се опитам да върна транзакцията (която просто хващам и игнорирам). Използвайки Atomikos като пул за връзки, ще виждам предупреждения за следващите няколко връзки, когато нещата се изчистят, но всичко все още работи добре.
Ясно е, че този подход може да не работи за всички, но поне това е заобиколно решение, когато извършвате обработката чрез заявка към базата данни или писането на по-сложна логика за извличане на резултати в пакети просто няма да работи.