Consulta (Query) Paginado

Generalmente cuando se realiza una consulta a una base de datos se traen “todos” los registros, lo cual funciona con conjuntos de tamaño razonable, pero con mas de 3000 registros ya puede traer problemas de performance, o de memoria (Memory Fault).

Lo mejor en estos caso es paginar, y lo bueno es que JDBC proporciona ciertas facilidades, como la función para saltar a un registro determinado “absolute()”. Y siendo JDBC funciona para la mayoria de las bases de datos: Oracle, MySQL, SyBase IQ, DB2.

Aquí hay un ejemplo completo, se le entrega el numero de pagina, y la cantidad de filas, y retorna un arreglo con los registros. Esta implementación mejora considerablemente el desempeño (performance) de la consulta (query), debido que el conjunto resultado (result set) que se recorre, y maneja es mucho menor.

El ejemplo tambien sirve para ver como se debe hacer una consulta a la base de datos en Java, con JDBC, ya que implementa otras recomendaciones comunes, como el uso de “prepared statement”, que tambien optimiza la ejecución de las consultas, precompilando el query en la Base de Datos, y manteniendolo en “cache” para futuras ejecuciones (donde solo cambia los parametros de busqueda).

public ArrayList seleccionaPaginado(Connection conexionX, int nroPaginaX, int cantidadFilasX)throws Exception{

	  String sqlX;
	  ArrayList arreglo = new ArrayList();

	  int filaActual = 0;
	  if (nroPaginaX > 0) {
		  filaActual = (nroPaginaX - 1) * cantidadFilasX;
	  }

	  sqlX = "select * from EJEMPLO";
	  arreglo.clear();
	  String codigoX;
	  String tituloX;

	  try{
		  PreparedStatement pStatemenX = conexionX.prepareStatement(sqlX,
				  ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
		  ResultSet rSetX = pStatemenX.executeQuery();

		  if (filaActual>0){
			  boolean loHizo = rSetX.absolute(filaActual);
		  }   

		  int i=0;
		  while (rSetX.next() && i < cantidadFilasX) {
			  codigoX = rSetX.getString("CODIGO");
			  tituloX = rSetX.getString("TITULO");

			  arreglo.add(codigoX+", "+tituloX);
			  i++;
		  }

		  rSetX.close();
	  }catch (Exception e){
		  System.out.println(e.toString());
		  throw e;
	  }

	  return arreglo;
}
Advertisements