sql >> Database teknologi >  >> RDS >> Mysql

Streaming af store resultatsæt med MySQL

Kun indstilling af hentestørrelsen er ikke den korrekte fremgangsmåde. javadoc af Statement#setFetchSize() står allerede følgende:

Giver JDBC-driveren et tip med hensyn til antallet af rækker, der skal hentes fra databasen

Føreren er faktisk fri til at anvende eller ignorere tippet. Nogle drivere ignorerer det, nogle drivere anvender det direkte, nogle drivere har brug for flere parametre. MySQL JDBC-driveren falder i den sidste kategori. Hvis du tjekker MySQL JDBC-driveren dokumentation , vil du se følgende oplysninger (rul ca. 2/3 ned, indtil overskriften Resultatsæt ):

For at aktivere denne funktionalitet skal du oprette en Statement-forekomst på følgende måde:

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

Læs venligst hele afsnittet i dokumentet, beskriver den også forbeholdene ved denne tilgang. Her er et relevant citat:

Der er nogle forbehold med denne tilgang. Du bliver nødt til at læse alle rækkerne i resultatsættet (eller lukke det), før du kan udstede andre forespørgsler på forbindelsen, ellers vil en undtagelse blive kastet.

(...)

Hvis erklæringen er inden for en transaktions omfang, frigives låsene, når transaktionen er fuldført (hvilket indebærer, at erklæringen skal fuldføres først). Som med de fleste andre databaser er sætninger ikke fuldstændige, før alle de resultater, der afventer sætningen, er læst, eller det aktive resultatsæt for sætningen er lukket.

Hvis det ikke løser OutOfMemoryError (ikke Exception ), så er problemet sandsynligvis, at du gemmer alle data i Javas hukommelse i stedet for at behandle dem med det samme så snart dataene kommer ind. Dette ville kræve flere ændringer i din kode, måske en fuldstændig omskrivning. Jeg har besvaret lignende spørgsmål før her .



  1. Meget langsom opstart af Spring Boot-applikation

  2. SQL-syntaksudtryk for 'WHERE (col1, col2) <(val1, val2)'

  3. Indsæt et tidsstempel i databasen via ContentValues

  4. Dvaledialekt for Oracle Database 11g?