Pergunta

Eu executada uma consulta JDBC para obter um conjunto de resultados. Antes de iteração sobre isso, eu gostaria de descobrir rapidamente quantas linhas foram retornadas. Como posso fazer isso com alta performance?

Eu estou usando Java 6, Oracle 11g, e os drivers mais recentes do Oracle JDBC.

Foi útil?

Solução

Você vai ter que fazer isso como uma consulta separada, por exemplo:

SELECT COUNT(1) FROM table_name

Alguns drivers JDBC pode te dizer, mas este é um comportamento opcional e, mais ao ponto, o motorista pode não saber ainda. Isto pode ser devido à forma como a consulta é otimizada por exemplo, duas estratégias exemplo de execução no Oracle são para obter todas as linhas o mais rápido possível ou para obter a primeira linha o mais rápido possível.

Se você fizer duas consultas separadas (uma uma contagem ea outra a consulta), então você terá que fazê-las dentro da mesma transação. Isso vai funcionar bem em Oracle, mas pode ser problemático em outros bancos de dados (por exemplo, SQL Server irá quer mostrar-lhe dados não confirmados ou bloco em uma atualização não confirmadas externa dependendo do seu nível de isolamento enquanto Oracle suporta um nível de isolamento que lhe dá uma visão transacional consistente do dados sem bloquear as atualizações externas).

Normalmente, embora realmente não importa quantas linhas existem. Normalmente este tipo de consulta é ou lote transformado ou paginada e de qualquer forma você tem informações sobre o progresso na forma de linhas carregado / processado e você pode detectar o final do conjunto de resultados (obviamente).

Outras dicas

ResultSet rs = stmt.executeQuery(sql);
int rowCount = rs.last() ? rs.getRow() : 0; // Number of rows in result set. Don't forget to set cyrsor to beforeFirst() row! :)

Resposta curta:. Você não pode

resposta

Long:. Você não pode, em parte porque o banco de dados pode ser preguiçosamente avaliar a consulta, retornando apenas linhas como você perguntar para eles

EDIT: Usando um ResultSet rolável você pode:)

Na verdade, eu fiz esta pergunta muito nas bases de dados Java newsgroup há muito tempo (em 2001!) E teve algum respostas votos .

Para obter o número de linhas de JDBC:

ResultSet rs = st.executeQuery("select count(*) from TABLE_NAME");
rs.next();
int count = rs.getInt(1);

Se os seus suportes motorista de TI (!), Você pode chamar ResultSet.afterLast () ResultSet.getRow () ResultSet.beforeFirst (). Desempenho pode ou não ser bom.

A melhor solução seria reescrever o seu algoritmo de não exigir o tamanho na frente.

Sem operador ternário

rs.last();  // Moves the cursor to the last row in this ResultSet object.
int rowCount = rs.getRow();  //Retrieves the current row number.
rs.beforeFirst(); //Moves the cursor to the front of this ResultSet object,just before the first row.

Com operador ternário uma linha

int rowCount = rs.last() ? rs.getRow() : 0; 
rs.beforeFirst();

Código:

//Create a Statement class to execute the SQL statement
Statement stmt = con.createStatement();

ResultSet rs = stmt.executeQuery("SELECT COUNT(*) AS COUNT FROM
TABLENAME");

 while(rs.next()) {
    System.out.println("The count is " + rs.getInt("COUNT"));
 }

 //Closing the connection
 con.close();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top