recorrer - obtener nombre columna resultset java
¿Un ResultSet carga todos los datos en la memoria o solo cuando se solicita? (5)
Tengo una página .jsp donde tengo una tabla GUI que muestra registros de una base de datos Oracle. Esta tabla permite el comportamiento de paginación típico, como "PRIMERO", "SIGUIENTE", "ANTERIOR" y "ÚLTIMO". Los registros se obtienen a partir de un objeto ResultSet de Java que se devuelve al ejecutar una instrucción SQL.
Este ResultSet podría ser muy grande, entonces mi pregunta es:
Si tengo un ResultSet que contiene un millón de registros pero mi tabla solo muestra los datos de los primeros diez registros en el ResultSet, ¿los datos solo se obtienen cuando comienzo a solicitar datos del registro o todos los datos se cargan completamente en la memoria una vez que ResultSet se devuelve al ejecutar una declaración SQL?
El ResultSet de Java es un puntero (o cursor) para los resultados en la base de datos. El ResultSet carga registros en bloques desde la base de datos. Entonces, para responder a su pregunta, los datos solo se obtienen cuando lo solicita pero en bloques.
Si necesita controlar cuántas filas obtiene el controlador al mismo tiempo, puede usar el método setFetchSize() en el ResultSet. Esto le permitirá controlar qué tan grande es el bloque que recupera a la vez.
La especificación JDBC no especifica si los datos se transmiten o si se cargan en la memoria. Oracle transmite por defecto. MySQL no. Para hacer que MySQL transmita el conjunto de resultados, debe configurar lo siguiente en la Declaración:
pstmt = conn.prepareStatement(
sql,
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY);
pstmt.setFetchSize(Integer.MIN_VALUE);
La mejor idea es hacer una consulta secundaria y visualizar 100 o 1000 filas a la vez / en una sola página. Y administrando la conexión mediante el agrupamiento de conexiones.
Para hacer una subconsulta, puede usar Recuento de filas en oráculo y Límite en MY SQL.
Si bien la especificación JDBC no especifica si se obtendrán todos los datos en el conjunto de resultados, cualquier controlador bien escrito no hará eso.
Dicho esto, un conjunto de resultados desplazables podría ser más de lo que usted tiene en mente: (enlace redactado, apunta a una página de spyware)
También puede considerar un conjunto de filas desconectado, que está almacenado en la sesión (dependiendo de cuán escalable deba ser su sitio): http://java.sun.com/j2se/1.4.2/docs/api/javax/sql/RowSet.html
digamos que tenemos una tabla que contiene 500 registros en ella
PreparedStatement stm=con.prepareStatement("select * from table");
stm.setFetchSize(100);// now each 100 records are loaded together from the database into the memory,
// and since we have 500 5 server round trips will occur.
ResultSet rs = stm.executeQuery();
rs.setFetchSize (50);//overrides the fetch size provided in the statements,
//and the next trip to the database will fetch the records based on the new fetch size