Como sei quantas linhas foram retornadas doBD no ResultSet?

A maioria dos meus códigos de consulta SQL segue este padrão:

sql = "select pato from lagoa";
PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.execute();
while (rs.next()) {
    comando ;
}

Mas às vezes preciso saber quantas linhas foram retornadas dentro do ResultSet. Por exemplo, posso precisar armazenar todos os registros em um ArrayList ou HashMap (isto é viável, porque minha tabela tem poucos registros). Mas quero saber quantos são, para poder instanciar o ArrayList desta maneira:

int tamanho = metodoMagicoQueRetornaONumeroDeLinhasNoResultSet(rs);
ar = new ArrayList(tamanho);

Existe este método ? Já olhei na classe java.sql.ResultSetMetaData (seria a classe mais adequada para isso) e não tem nada parecido.
A solução mais popular na net consiste em usar o cursor do ResultSet para isso. Posicione-o no final, veja o número da linha e devolva o cursor para o início.

rs.afterLast();
int tamanho = rs.getRow();
rs.beforeFirst();

Se esta solução é rápida, é pq internamente as linhas são armazenadas em um array ou Collection ou algum blah. Logo, ele até poderia ter um método para retornar o size do array ou Collection dentro dele, não ?

Não tenho muita certeza porque não pude testar o método aqui, agora, mas acho ki ResultSet.getFetchSize() é a solução que vc procura. DOC-API do .getFetchSize()

Não… O getFetchSize não faz isso. Veja em setFetchSize:
http://java.sun.com/j2se/1.4.2/docs/api/java/sql/ResultSet.html#setFetchSize(int)

O Fecth size indica, para cada linha a retornar do BD para a memória, quantas linhas deveriam ser buscadas, de maneira a minimizar o número de “fetches”. Na prática, é um cache.

Não resolve o problema…

Na realidade o resultset é um objeto ligado ao banco, e ao executar a consulta no banco ele não te traz todos os resultados de uma única vez… Imagine uma consulta com mais de 2000 linhas?
É ai que entra o FechSize() tb…
Voltando, a solução que você está utilizando é correta sim… e creio que a função resultset.Size() não existe por essa pecularidade do resultset.

[]'s

É realmente não mandei bem dessa vez… peço desculpas até pelo post que fiz, porque realmente era só ler a API e ver que esse método não era o correto e teria evitado esse post que não ajudou em nada hehe. De qualquer forma estamos aí…

Quer dizer então que o driver do BD não sabe quantas linhas foram retornadas, só o banco sabe isso ? Faz sentido…

E quanto a mover o cursor para frente ou para trás ? É apenas um chute, mas acho que pode levar o banco a tentar cachear as linhas ao redor do cursor, sendo que não quero usar essas linhas agora, quero apenas saber o número delas, pra saber o número de linhas retornado ! Isso está correto ? Mover o cursor é desaconelhável ?

sabiah, vale o espírito de ajuda a comunidade :cool:

HomemPalindromo, é desaconselhavel você colocar um contador e mover o cursor elemento por elemento na resultset.
Mas, como você citou antes, posicionar o cursor no último elemento e ver qual é a ID dele está correto e é como usualmente é feito :wink:

[]'s