Mini howto: JTable y ResultSet: combinación eficiente.
Escrito por: Roberto en java, TecnologiaEn la aplicación que estoy haciendo en mi tema de memoria, me topé con un problema. Bueno, en realidad el problema me lo planteo mi profesor guía. Contextualizando un poco el asunto, estoy haciendo una aplicación en java y es de escritorio, por lo que también ocupo Swing para la interfaz gráfica.
El cuento es que necesitaba mostrar unos resultados de una consulta a una base de datos y al tener muchos registros como respuesta al mostrarlos en un JTable iba a ser algo costoso en cuanto al uso de memoria ram. Originalmente estaba ocupando un ArrayList el cual mostraba ocupando un JTable. Eso implicaba tener TODOS los registros de la consulta en memoria. Si calculamos a vuelo de pájaro que cada registro ocupaba 120 caracteres a un costo de 1 byte por carácter por unos miserables 500 registros, tenemos 60000 bytes, dividiento por 1024, tendríamos 58.59 mbkb (espero que el calculo este bien hechoestaba mal hecho :)) en el puro arreglo… lo que es bastante poco eficiente. Así que una de mis misiones era darle un vistazo a eso y encontrar alguna manera eficiente de hacerlo.
Obviamente no quise reinventar la rueda y me tope con un exelente articulo el cual incluye tambien unas clases.
La gracia de lo anterior, es que en vez de ocupar el modelo por defecto que por ejemplo nos ofrece NetBeans es setear nuestro propio modelo el cual se va cargando a medida que lo vamos necesitando (en la práctica, cada vez que pinchamos el scroll). Esta muy bien documentada la clase y tiene varios constructores. Un ejempo de uso de los anterior seria el siguiente extracto de código:
//Creamos nuestra conexión a la base de datos
Connection conexion = Utiles.ManejadorConexionSql.conectarBd();
//hacemos una llamada a la base de datos
String stringConsulta = "select * from algunaTabla";
//Seteamos el Statement como es requisito para nuestra clase que hace la magia
Statement consulta = conexion.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
//Obtenemos nuestro resultset.
ResultSet resultado = consulta.executeQuery(stringConsulta);
//Creamos la clase que nos dara nuestro modelo
ScrollableTableModel tablaModelo = new ScrollableTableModel(resultado);
//Le ajustamos el modelos a nuestra tabla
jTaableResultado.setModel(tablaModelo);
En el documento esta muy claro explicado como lo hace internamente para quien quiera destripar la clase.

Entradas (RSS)
July 16th, 2008 a las 1:38 pm
de hecho está mal hecho el ca?culo, porque tendrías 58.59 kb y no mb.
happy hacking
July 16th, 2008 a las 9:04 pm
Gracias por los alcances…
Si le aumentamos unos cero a la cantidad de registros, el uso en memoria se torna importante… y bueno, la cosa también sirve