PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak odczytać wszystkie wiersze z ogromnego stołu?

Krótka wersja to, wywołaj stmt.setFetchSize(50); i conn.setAutoCommit(false); aby uniknąć czytania całego ResultSet do pamięci.

Oto, co mówią dokumenty:

Uzyskiwanie wyników na podstawie kursora

Domyślnie sterownik zbiera wszystkie wyniki zapytania jednocześnie. Może to być niewygodne w przypadku dużych zestawów danych, dlatego sterownik JDBC umożliwia oparcie zestawu wyników na kursorze bazy danych i pobranie tylko niewielkiej liczby wierszy.

Niewielka liczba wierszy jest buforowana po stronie klienta połączenia, a po wyczerpaniu następny blok wierszy jest pobierany przez zmianę pozycji kursora.

Uwaga:

  • Zestawy wyników oparte na kursorze nie mogą być używane we wszystkich sytuacjach. Istnieje szereg ograniczeń, które spowodują, że kierowca po cichu powróci do pobrania całego zestawu wyników za jednym razem.

  • Połączenie z serwerem musi korzystać z protokołu V3. Jest to ustawienie domyślne (i obsługiwane tylko przez) serwer w wersji 7.4 i nowszych.-

  • Połączenie nie może być w trybie automatycznego zatwierdzania. Backend zamyka kursory na końcu transakcji, więc w trybie automatycznego zatwierdzania backend zamknie kursor, zanim cokolwiek będzie można z niego pobrać.-

  • Instrukcja musi być utworzona z typem ResultSet o typie ResultSet.TYPE_FORWARD_ONLY. Jest to ustawienie domyślne, więc żaden kod nie będzie musiał być przepisany, aby z tego skorzystać, ale oznacza to również, że nie można przewijać do tyłu ani w inny sposób przeskakiwać w zestawie wyników.-

  • Podane zapytanie musi być pojedynczą instrukcją, a nie wieloma instrukcjami połączonymi ze średnikami.

Przykład 5.2. Ustawiam rozmiar pobierania, aby włączać i wyłączać kursory.

Zmiana kodu w tryb kursora jest tak prosta, jak ustawienie odpowiedniego rozmiaru pobieranej instrukcji. Ustawienie rozmiaru pobierania z powrotem na 0 spowoduje, że wszystkie wiersze będą buforowane (zachowanie domyślne).

// make sure autocommit is off
conn.setAutoCommit(false);
Statement st = conn.createStatement();

// Turn use of the cursor on.
st.setFetchSize(50);
ResultSet rs = st.executeQuery("SELECT * FROM mytable");
while (rs.next()) {
   System.out.print("a row was returned.");
}
rs.close();

// Turn the cursor off.
st.setFetchSize(0);
rs = st.executeQuery("SELECT * FROM mytable");
while (rs.next()) {
   System.out.print("many rows were returned.");
}
rs.close();

// Close the statement.
st.close();


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. BŁĄD:nie można załadować biblioteki „/opt/PostgreSQL/9.0/lib/postgresql/plperl.so”:libperl.so:

  2. jak zmienić port nasłuchiwania postgresql w systemie Windows?

  3. AFTER LOGON(Oracle) trigger w PostgreSQL z rozszerzeniem – login_hook

  4. Kontener Dockera dla Postgres 9.1 nie ujawnia portu 5432 hostowi

  5. Zwróć uniksowy znacznik czasu w PostgreSQL