sql >> Databáze >  >> RDS >> Mysql

Uzavření sady výsledků streamování (pomocí mysql jdbc) trvá dlouho

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.




  1. Co je kontrolní omezení v SQL Server - SQL Server / TSQL výukový program, část 82

  2. Přidejte Ordinal Indicator k datu v Oracle

  3. Změněno PDO::ATTR_EMULATE_PREPARES na FALSE a dochází k chybě Neplatné číslo parametru

  4. Jak vyprázdním vyrovnávací paměť PRINT v TSQL?