sql >> Database >  >> RDS >> Mysql

Grote resultatensets streamen met MySQL

Alleen de ophaalgrootte instellen is niet de juiste aanpak. De javadoc van Statement#setFetchSize() stelt al het volgende:

Geeft de JDBC-driver een hint wat betreft het aantal rijen dat moet worden opgehaald uit de database

De bestuurder is eigenlijk vrij om de hint toe te passen of te negeren. Sommige stuurprogramma's negeren het, sommige stuurprogramma's passen het rechtstreeks toe, sommige stuurprogramma's hebben meer parameters nodig. Het MySQL JDBC-stuurprogramma valt in de laatste categorie. Als u het MySQL JDBC-stuurprogramma controleert documentatie , ziet u de volgende informatie (scroll ongeveer 2/3 naar beneden tot kop ResultSet ):

Om deze functionaliteit in te schakelen, moet u op de volgende manier een Statement-instantie maken:

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);

Lees de hele sectie van het document, beschrijft het ook de kanttekeningen bij deze benadering. Hier is een relevant citaat:

Er zijn enkele kanttekeningen bij deze benadering. U moet alle rijen in de resultatenset lezen (of sluiten) voordat u andere vragen over de verbinding kunt stellen, anders wordt er een uitzondering gegenereerd.

(...)

Als het afschrift binnen het bereik van een transactie valt, worden de vergrendelingen vrijgegeven wanneer de transactie is voltooid (wat betekent dat het afschrift eerst moet worden voltooid). Zoals met de meeste andere databases, zijn instructies pas compleet als alle resultaten die op de instructie wachten, zijn gelezen of de actieve resultatenset voor de instructie is gesloten.

Als dat de OutOfMemoryError . niet verhelpt (niet Exception ), dan is het probleem waarschijnlijk dat u alle gegevens in het geheugen van Java opslaat in plaats van deze onmiddellijk te verwerken zodra de gegevens binnenkomen. Dit vereist meer wijzigingen in uw code, misschien een volledige herschrijving. Ik heb een soortgelijke vraag eerder hier .



  1. Over knelpunten in de prestaties van SQL Server gesproken

  2. SQLite niet zo'n kolom

  3. postgresql dubbele sleutel schendt unieke beperking

  4. Waarom heb je datamodellering nodig?