java - microsoft - sql server jdbc 7
¿Cómo funciona PreparedStatement.executeQuery? (2)
¿Cómo funciona PreparedStatement.executeQuery
? ¿Obtiene resultados de la base de datos y los repito? O obtiene el primer resultado, y en record.next continúa con la consulta SQL a la siguiente fila?
ResultSet record = statement.executeQuery("select * from users");
while (record.next()) {
//do something
}
gracias
De la documentación:
public ResultSet executeQuery(String sql) throws SQLException
Ejecuta la instrucción SQL dada, que devuelve un solo objeto ResultSet.
Una tabla de datos que representa un conjunto de resultados de la base de datos, que generalmente se genera al ejecutar una declaración que consulta la base de datos.
public boolean next() throws SQLException
Mueve el cursor hacia abajo una fila desde su posición actual. Un cursor ResultSet se coloca inicialmente antes de la primera fila; la primera llamada al método siguiente convierte a la primera fila en la fila actual; la segunda llamada hace que la segunda fila sea la fila actual, y así sucesivamente.
Si una secuencia de entrada está abierta para la fila actual, una llamada al método siguiente la cerrará implícitamente. La cadena de advertencia de un objeto ResultSet se borra cuando se lee una nueva fila.
Como representación, esto significa que la declaración se ejecuta una vez y cuando se itera se itera sobre el resultado de esa ejecución.
Pero cómo se maneja el resultado de la base de datos depende realmente de la implementación. Para hacer un contraste, haré referencia a dos bases de datos MSSQL, MYSQL.
MSSQL
La documentación del controlador MSSQL que comenta exactamente cómo se manejan los resultados se puede encontrar aquí :
Hay dos tipos de conjuntos de resultados: del lado del cliente y del lado del servidor.
Los conjuntos de resultados del lado del cliente se usan cuando los resultados pueden caber en la memoria de proceso del cliente. Estos resultados proporcionan el rendimiento más rápido y los lee el controlador JDBC de Microsoft para SQL Server en su totalidad desde la base de datos. Estos conjuntos de resultados no imponen carga adicional en la base de datos al incurrir en la sobrecarga de creación de cursores del lado del servidor. Sin embargo, estos tipos de conjuntos de resultados no son actualizables.
Los conjuntos de resultados del lado del servidor se pueden usar cuando los resultados no encajan en la memoria de proceso del cliente o cuando el conjunto de resultados debe ser actualizable. Con este tipo de conjunto de resultados, el controlador JDBC crea un cursor del lado del servidor y obtiene las filas del conjunto de resultados de forma transparente a medida que el usuario se desplaza por él.
MySQL
Implementación de MySql de la interfaz JDBC que puedes leer aquí :
Por defecto, los ResultSets se recuperan por completo y se almacenan en la memoria. En la mayoría de los casos, esta es la forma más eficiente de operar y, debido al diseño del protocolo de red MySQL, es más fácil de implementar. Si está trabajando con ResultSets que tienen una gran cantidad de filas o valores grandes, y no puede asignar espacio de pila en su JVM para la memoria requerida, puede indicarle al controlador que transmita los resultados una fila por vez.
Lo estás haciendo correctamente. Obtiene los resultados completos de su consulta y los recorre.
El puntero interno, o cursor, inicialmente comienza antes de la primera fila, por lo que al llamar a record.next()
lo moverá a la primera fila.
http://docs.oracle.com/javase/1.4.2/docs/api/java/sql/ResultSet.html#next%28%29