Pregunta

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?

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

¿Fue útil?

Solución

Tendrá que hacer esto como una consulta separada, por ejemplo:

SELECT COUNT(1) FROM table_name

Es posible que algunos controladores JDBC le informen, pero este es un comportamiento opcional y, más al punto, es posible que el controlador aún no lo sepa. Esto puede deberse a cómo 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 la primera fila lo más rápido posible.

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

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

Otros consejos

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! :)

Respuesta corta: no puedes.

Respuesta larga: no puedes, en parte porque la base de datos puede estar evaluando la consulta de forma perezosa, solo devolviendo filas cuando las solicites.

EDITAR: utilizando un conjunto de resultados desplazable, puede :)

De hecho, hice esta pregunta en el grupo de noticias sobre bases de datos de Java hace mucho tiempo (¡en 2001!) y tuve algunos respuestas útiles .

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);

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 volver a escribir su algoritmo para no requerir el tamaño por adelantado.

Sin operador ternario

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.

Con operador ternario una línea

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top