PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como ler todas as linhas da tabela enorme?


A versão curta é, chame stmt.setFetchSize(50); e conn.setAutoCommit(false); para evitar ler todo o ResultSet na memória.

Veja o que dizem os documentos:

Obter resultados com base em um cursor

Por padrão, o driver coleta todos os resultados da consulta de uma só vez. Isso pode ser inconveniente para grandes conjuntos de dados, de modo que o driver JDBC fornece um meio de basear um ResultSet em um cursor de banco de dados e buscar apenas um pequeno número de linhas.

Um pequeno número de linhas é armazenado em cache no lado do cliente da conexão e, quando esgotado, o próximo bloco de linhas é recuperado pelo reposicionamento do cursor.

Observação:

  • ResultSets baseados em cursor não podem ser usados ​​em todas as situações. Há uma série de restrições que farão com que o driver volte silenciosamente para buscar todo o ResultSet de uma só vez.

  • A conexão com o servidor deve estar usando o protocolo V3. Este é o padrão para (e é suportado apenas por) versões de servidor 7.4 e posteriores.-

  • A conexão não deve estar no modo de confirmação automática. O back-end fecha os cursores no final das transações, portanto, no modo de confirmação automática, o back-end terá fechado o cursor antes que qualquer coisa possa ser obtida dele.-

  • A Instrução deve ser criada com um tipo ResultSet de ResultSet.TYPE_FORWARD_ONLY. Este é o padrão, portanto, nenhum código precisará ser reescrito para tirar proveito disso, mas também significa que você não pode rolar para trás ou pular no ResultSet.-

  • A consulta fornecida deve ser uma única instrução, não várias instruções encadeadas com ponto e vírgula.

Exemplo 5.2. Configurando o tamanho da busca para ativar e desativar os cursores.

Alterar o código para o modo de cursor é tão simples quanto definir o tamanho de busca da instrução para o tamanho apropriado. Definir o tamanho da busca de volta para 0 fará com que todas as linhas sejam armazenadas em cache (o comportamento padrão).
// 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();