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

Streamování velkých sad výsledků pomocí MySQL

Pouze nastavení velikosti načtení není správný přístup. javadoc z Statement#setFetchSize() již uvádí následující:

Poskytuje ovladači JDBC nápovědu pokud jde o počet řádků, které by měly být načteny z databáze

Řidič může ve skutečnosti nápovědu použít nebo ignorovat. Některé ovladače to ignorují, některé to aplikují přímo, některé ovladače potřebují více parametrů. Ovladač MySQL JDBC spadá do poslední kategorie. Pokud zkontrolujete ovladač MySQL JDBC dokumentaci , uvidíte následující informace (posuňte se asi o 2/3 dolů, dokud nebude záhlaví ResultSet ):

Chcete-li povolit tuto funkci, musíte vytvořit instanci příkazu následujícím způsobem:

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

Přečtěte si prosím celé části dokumentu popisuje také výhrady tohoto přístupu. Zde je relevantní citace:

Tento přístup má několik výhrad. Budete muset přečíst všechny řádky v sadě výsledků (nebo ji zavřít), než budete moci zadat jakékoli další dotazy na připojení, jinak bude vyvolána výjimka.

(...)

Pokud je příkaz v rozsahu transakce, zámky se uvolní po dokončení transakce (což znamená, že příkaz musí být dokončen jako první). Stejně jako u většiny ostatních databází nejsou příkazy kompletní, dokud nejsou přečteny všechny výsledky čekající na příkaz nebo dokud není uzavřena aktivní sada výsledků pro daný příkaz.

Pokud to nevyřeší OutOfMemoryError (nikoli Exception ), pak je problém pravděpodobně v tom, že všechna data ukládáte do paměti Java, místo abyste je zpracovávali okamžitě jakmile data přijdou. To by vyžadovalo více změn ve vašem kódu, možná kompletní přepsání. Na podobnou otázku jsem již odpověděl zde .



  1. Změňte sloupec MySQL tak, aby byl AUTO_INCREMENT

  2. Snadná konverze / migrace MS Access do Oracle

  3. Jak získat krátký název měsíce z data v MariaDB

  4. proč PG::UniqueViolation:ERROR:duplicitní hodnota klíče porušuje jedinečné omezení?