Contando linhas no ResultSet

7 respostas
D

Estava eu feliz e contente lendo o FAQ da API do JDBC quando me deparei com uma pergunta que já havia me atormentado.
Existe como contar o numero de linhas de um ResultSet? (pergunta 18).
A resposta lá diz para usar os metodos .last depois o .getRow que vão para o ultimo item e pega o numero daquela linha (respectivamente, se o ResultSet for scrollable).

Porém, um dia fiz este testiculo e o tempo de demora foi de aproximadamente 6 seg. (numa página lá), porém, se eu criasse outro ResultSet e usasse a mesma select só que desta vez com um COUNT o tempo demorava quase 2 segundos.

Alguem tem uma sugestão melhor do que 2 ResultSets um com a consulta e outro com o COUNT?

======
Não ha nda pior do que ouvir “como vc esta bonito hoje!”.
Pera ai, HOJE??? E ontem? E antes de ontem? E semana passada?

7 Respostas

dgouvea

Assim que vc for lendo os registros vc vai armazendo o número da linha em uma variável, quando o resultset chegar no fim sua variável vai ter o valor da ultima linha e vc não perdeu tempo nenhum.

int rows = 0;

while ( rs.next() ) {
    rows = rs.getRow();
}
D

Hmmm…
Não rola.
Quer dizer, no meu caso né.
A página mostra X registros por vez (configurado no .xml), então, uma listagem de funcionarios (1000 registros) ia mostrar (p.ex.) 10 por vez, ai tem um rodapézinho que fala “página 1 de 100 de um total de 1000 registros”.
Ai no caso não vai, pq o while só vai até 10.

Wel…

tks any way

brlima

Foi bem o que fiz: como trabalho com os dados dentro de um TableModel, quando o resultset carrega ele, eu ja tenho o numero de linhas…

Vc tb poderia dar um count no seu select antes de fazelo, ja que o count nao é tao demorado qto fazer um select e rolar ate o fim pra saber… :smiley:

dgouvea

Neste caso acho que a melhor solução seria dar o count mesmo.
:slight_smile:

louds

Alguns bancos possuem extensões que permitem calcular a quantidade de registros sem precisar executar 2 selects. O mysql permite isso, por exemplo.

select SQL_CALC_FOUND_ROWS * from cliente where cliente.xxx
select FOUND_ROWS();

Minha sugestão é voce usar paginação dos resultados, não traga todos resultados se não vai precisar.

ozielneto

O melhor mesmo seria usar o Pattern do ValueListHandler, para fazer a paginacao de registros…

[]'s

ozielneto

E quase esqueci, nao da pra voce contar quantas linhas tem um ResultSet… E nao indico fazer um Select Count pra depois fazer outro Select de Dados… Vai deixar o sistema lento…

Por isso indiquei o ValueListHandler…

Bom trabalho…

Criado 29 de janeiro de 2004
Ultima resposta 29 de jan. de 2004
Respostas 7
Participantes 5