2008-10-02 13 views
23

He ejecutado una consulta JDBC para obtener un conjunto de resultados. Antes de iterar sobre él, me gustaría saber rápidamente cuántas filas se devolvieron. ¿Cómo puedo hacer esto con un alto rendimiento?¿Cómo obtengo el recuento de filas en JDBC?

Estoy usando Java 6, Oracle 11g y los últimos controladores JDBC de Oracle.

Respuesta

26

vas a tener que hacer esto como una consulta independiente, por ejemplo:

SELECT COUNT(1) FROM table_name 

Algunos controladores JDBC le puede decir pero esto es opcional y el comportamiento, más al punto, el conductor no puede sé todavía. Esto puede deberse a la forma en que se optimiza la consulta; por ejemplo, dos estrategias de ejecución de ejemplo en Oracle son obtener todas las filas lo más rápido posible o obtener la primera fila lo más rápido posible.

Si realiza dos consultas por separado (una para el recuento y otra para la consulta), deberá realizarlas en la misma transacción. Esto funcionará bien en Oracle pero puede ser problemático en otras bases de datos (por ejemplo, SQL Server mostrará datos no confirmados o bloqueará una actualización externa no comprometida dependiendo de su nivel de aislamiento, mientras que Oracle admite un nivel de aislamiento que le brinda una vista transaccionalmente consistente del datos sin bloqueo en actualizaciones externas).

Aunque normalmente no importa cuántas filas hay. Normalmente, este tipo de consulta se procesa por lotes o se busca y, en cualquier caso, tiene información de progreso en forma de filas cargadas/procesadas y puede detectar el final del conjunto de resultados (obviamente).

+0

buena respuesta, aunque no entiendo el comentario final acerca de tener información de progreso. ¿De dónde viene esto? – Aktau

+0

Esto requiere otra consulta. Si tiene un conjunto de resultados desplazable, hay mejores opciones en otras respuestas. – JDuarteDJ

18

Respuesta corta: no se puede.

Respuesta larga: no se puede, en parte porque la base de datos puede estar evaluando la consulta de forma perezosa, solo devolviendo las filas a medida que las solicita.

EDIT: El uso de un conjunto de resultados desplazable que puede :)

De hecho, he hecho esta misma pregunta en el grupo de noticias de Java bases de datos de hace mucho tiempo (en 2001!) Y tenía algunos helpful responses.

4

Si su controlador lo admite (!), Puede llamar a ResultSet.afterLast() ResultSet.getRow() ResultSet.beforeFirst(). El rendimiento puede o no ser bueno.

Una mejor solución sería reescribir su algoritmo para no requerir el tamaño por adelantado.

15
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! :) 
+4

Funciona bien. Debe agregar que necesita un conjunto de resultados desplazable para esto. –

+0

Apoya el comentario anterior y creo que esta debería ser la respuesta correcta, ya que proporciona una forma más rápida y más directa de hacerlo. – JDuarteDJ

+0

¿Cómo funciona esto? – Winter

0

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

Esta debería ser la respuesta. Funciona perfectamente. –

+1

La pregunta es acerca de cuántas filas en el conjunto de resultados. No el recuento de filas de la tabla – ernesto

10

para obtener el número de filas de JDBC:

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

nadie pregunta cuántas filas hay en una tabla, la pregunta es cuántas filas hay en el conjunto de resultados. – ernesto

Cuestiones relacionadas