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();