Tamanho de um ResultSet

Olá:

Estive dando uma olhada na API da java.sql.ResultSet e reparei que não há nenhum método que retorna o tamanho desta, ou seja, quantas linhas obtive da query. Obviamente posso correr por todo o ResultSet até o final com um contador e depois contar quantas linhas obtive. Creio que ficaria assim:

int numLinhas = 0;
while(rs.next()) {
numLinhas ++;
}
System.out.println("Há " + numLinhas + " linhas na query.");

Mas como determinar a priori? Será que isso depende da implementação de cada driver?

Grato,

Acertou :?

Alguns bancos não tem como saber o número de registros retornados em um ResultSet devido a otimizacoes feitas no driver (é meio ‘caro’ saber o tamanho de um ResultSet às vezes). Mas, se vc está iterando sobre o ResultSet de alguma maneira, aproveite pra usar um contador, ou então faça dois SELECTs, um pra pegar os dados e outro com um count().

Eu tava fazendo uns testes com isso esses tempos, e

rs.last();
int totalOfRecords = rs.getRow();
rs.beforeFirst();

foi um pouco mais rapido que o loop while().

Rafael

E aí não precisa fazer duas queries: uma com o count(*) e outra para obter as linhas.

É… mas para isso funcionar vc deve usar um Statement rolável
o q é muito caro em termos de instanciação.
Sei que existem situações onde queremos saber o tamanho do ResultSet, mas no mundo real o que se faz é popular um ArrayList com as linhas, e como na maioria das vezes nós adicionamos TODAS as linhas do ResultSet, basta usar o metodo size após popular o ArrayList.
Parece meio bobo, mas faz uma boa diferença entre Statement’s simples e Statement roláveis no quisito desempenho e uso de recursos.
É claro que usando ou não Statement’s simples vc irá popular o ArrayList, entaum por que gastar duas vezes não é mesmo !!

Claudio Gualberto.

Bem… eu tenho um caso onde recupero o resultado de uma stored procedure e gero um CSV.

Na primeita linha do meu CSV, eu preciso colocar o tamanho do arquivo, quantos registros a SP me retornou.

Não seria um problema jogar tudo em uma lista e depois pegar o tamanho da lista… o problema é que a SP me retorna cerca de 60000 linhas!!! e para optimizar a performance, escrevo o CSV direto com o resultado da stored procedure devidamente formatada.

Para a posteridade: creio que a forma certa de resolver isto seria contar o número de resultados no banco de dados (com os devidos indexes para tabelas grandes).
Por exemplo, no Postgresql você faria:

SELECT COUNT(*) as rowCount FROM users WHERE age > 21;