Foros del Web » Programación para mayores de 30 ;) » Java »

Llenar progresivamente un JTable

Estas en el tema de Llenar progresivamente un JTable en el foro de Java en Foros del Web. Hola, amigos javeros. Tengo un JInternalFrame en el que establezco los rangos de bùsqueda para la BD. Luego presiono un botón y me abre otro ...
  #1 (permalink)  
Antiguo 17/01/2011, 11:01
 
Fecha de Ingreso: noviembre-2010
Ubicación: Tandil
Mensajes: 79
Antigüedad: 14 años
Puntos: 3
Pregunta Llenar progresivamente un JTable

Hola, amigos javeros.

Tengo un JInternalFrame en el que establezco los rangos de bùsqueda para la BD. Luego presiono un botón y me abre otro JInternalFrame con una tabla ("tbl_filtros").
El siguiente método es el que trae los datos de la BD y está en el método formComponentShown del segundo JInternalFrame (el que contiene la tabla).

Código Javascript:
Ver original
  1. private void traerDatos(){
  2.         DefaultTableModel model = (DefaultTableModel) tbl_filtros.getModel();
  3.         Query query = sesion.createQuery("from Bienes where codigo between :descod and :hascod " +
  4.                                          "and nombre between :desnom and :hasnom " +
  5.                                          "and seccion between :dessec and :hassec " +
  6.                                          "and localizacion between :desloc and :hasloc " +
  7.                                          "and rubro between :desrub and :hasrub " +
  8.                                          "and fechaalta between :desalta and :hasalta order by codigo");
  9.         query.setParameter("descod", Integer.parseInt(codigoDe));
  10.         query.setParameter("hascod", Integer.parseInt(codigoHa));
  11.         query.setParameter("desnom", nombreDe);
  12.         query.setParameter("hasnom", nombreHa);
  13.         query.setParameter("dessec", Integer.parseInt(seccionDe));
  14.         query.setParameter("hassec", Integer.parseInt(seccionHa));
  15.         query.setParameter("desloc", Integer.parseInt(localizacionDe));
  16.         query.setParameter("hasloc", Integer.parseInt(localizacionHa));
  17.         query.setParameter("desrub", Integer.parseInt(rubroDe));
  18.         query.setParameter("hasrub", Integer.parseInt(rubroHa));
  19.         query.setParameter("desalta", fechaDe);
  20.         query.setParameter("hasalta", fechaHa);
  21.         Iterator<Entidades.Bienes> it = query.iterate();
  22.         while (it.hasNext()){
  23.             Entidades.Bienes b = it.next();
  24.             Object[] dat = {b.getCodigo(),
  25.                             b.getNombre(),
  26.                             b.getSecciones().getNombre(),
  27.                             b.getLocalizaciones().getNombre(),
  28.                             b.getRubros().getNombre(),
  29.                             b.getFechaalta(),
  30.                             b.getValororigen()};
  31.             model.addRow(dat);
  32.         }
  33.     }

Debido a que estoy trabajando con una BD relativamente grande (200.000 registros de 13 datos cada uno), el llenado de esta tabla demora un tiempo considerable, lo cual no es deseado a la vista del usuario. De qué forma puedo bajar los tiempos... es decir, ¿de qué forma puedo ir mostrando los datos a medida que los va cargando?

Muchas gracias.!
  #2 (permalink)  
Antiguo 17/01/2011, 15:49
Avatar de jhonmelguizo  
Fecha de Ingreso: enero-2008
Ubicación: Medellín - Colombia
Mensajes: 264
Antigüedad: 16 años, 11 meses
Puntos: 6
De acuerdo Respuesta: Llenar progresivamente un JTable

Amigo, eso lo puedes solucionar con hilos, ejecutas un hilo y lo dejas trabajando, mientras le puedes mostrar al usuario una barra de progreso en caso de que estéis utilizando SWING.

Saludos...

  #3 (permalink)  
Antiguo 18/01/2011, 10:28
 
Fecha de Ingreso: noviembre-2010
Ubicación: Tandil
Mensajes: 79
Antigüedad: 14 años
Puntos: 3
Exclamación Respuesta: Llenar progresivamente un JTable

Bien, muchas gracias. Ya lo he implementado con un hilo. Pero ahora tengo otro problema: al momento de hacer el WHILE, demora demasiado. Para cargar los 200000 registros tarda aprox 7 minutos. Si bien me deja seguir trabajando con la tabla, el tiempo es mucho.
El mejor tiempo que conseguí fue trabajando con list() en lugar de iterate(): 1 minuto aprox. Pero se pasaba todo ese minuto sin mostrar nada, ya que ese minuto es lo que demora en hacer el list(). Y al ser una sentencia sola (atómica), no me sirve de nada el hilo. Además si trabajo con list(), no puedo agregar una barra de progreso.
Por favor, si a alguien se le ocurre una solución elegante a este problema lo agradecería mucho.

Saludos.
  #4 (permalink)  
Antiguo 18/01/2011, 14:11
Avatar de jcMouse  
Fecha de Ingreso: noviembre-2009
Ubicación: Bolivia
Mensajes: 116
Antigüedad: 15 años
Puntos: 9
Respuesta: Llenar progresivamente un JTable

en donde se tarda mas no es en realizar la consulta en la base de datos, sino en cargar los datos en pantalla. lo que puedes hacer es, cargar los datos en memoria y despues cargarlos poco a poco en la interfaz, osea utilizando un metodo de paginacion

pregunta ¿es necesario que una consulta de busqueda genere tantos registros? segun entiendo en tu codigo, el resultado es un listado de casas o bienes, porque mejor no ampliar los parametros de busqueda
__________________
Problem?
Estoy aquí
Foro Code Army
  #5 (permalink)  
Antiguo 18/01/2011, 16:50
 
Fecha de Ingreso: noviembre-2010
Ubicación: Tandil
Mensajes: 79
Antigüedad: 14 años
Puntos: 3
Respuesta: Llenar progresivamente un JTable

Hola jcMouse. A este método lo puse en un hilo para darme cuenta qué es lo que realmente está tardando. Y ahora en lugar de usar el iterate() lo hago con el list(). Tarda aprox 20 segundos en hacer el list() y unos 8 segundos más en llenar la tabla.
Ahora bien... se que no es necesario hacer un listado de 200.000 registros, pero te comento... yo estoy ejecutando mi sistema en una PC con un procesador de 2.8 GHz con 1.5 GB de RAM. Lo que estoy intentando hacer es de alguna manera "emular" el comportamiento que tendrá este sistema en una Notebook conectándose a través de internet a la BD y con menos recursos que los que yo tengo. Es decir, quiero que en mi PC lo haga lo más rápido posible, para que al llevarlo a una PC con menos recursos y una conexión más lenta, no impacte en el rendimiento.
Y con respecto a la paginación, podrás explicarme un poco más de qué trata eso? O algún ejemplo en mi código?

Desde ya muchas gracias !!!
  #6 (permalink)  
Antiguo 19/01/2011, 09:59
Avatar de jhonmelguizo  
Fecha de Ingreso: enero-2008
Ubicación: Medellín - Colombia
Mensajes: 264
Antigüedad: 16 años, 11 meses
Puntos: 6
De acuerdo Respuesta: Llenar progresivamente un JTable

Como dice jcMouse, utilizar paginación.

Es decir en tu sentencia sql puedes ponerle un límite de supongamos 100 registros en pantalla, al jtable agregarle un objeto o trabajarlo con un objeto que te permita poner:
<<Atras 1 [2] 3 4 5 6 7 8 9... siguiente>>

Esto permite que no tengas que cargar tantos registros y sea progresivamente, si el usuario está interesado en continuar viendo más información continuará consultando con las opciones propuestas.

Saludos...
  #7 (permalink)  
Antiguo 19/01/2011, 11:35
 
Fecha de Ingreso: noviembre-2010
Ubicación: Tandil
Mensajes: 79
Antigüedad: 14 años
Puntos: 3
Respuesta: Llenar progresivamente un JTable

Gracias jhonmelguizo pero lamentablemente no me sirve esta opción, ya que necesito que el usuario vea todos los datos juntos para poder realizar comparaciones. Y por otro lado tengo que mostrar el monto TOTAL de los bienes. Para hacer esto, en algún momento debo levantar TODOS los datos juntos. Por estos motivos es que descarté el paginado.
Al final logré bajar los tiempos a 30 segundos aproximadamente, mediante la optimización del código. Y por otro lado le agregué un try / catch para que si la PC se queda sin memoria, nos muestre un mensaje indicándolo, y no que lance una Excepción.

Desde ya muchas gracias a todos por su tiempo !!!
Como siempre forosdelweb al pie del cañón.
  #8 (permalink)  
Antiguo 25/03/2011, 13:08
 
Fecha de Ingreso: septiembre-2010
Ubicación: Malaga
Mensajes: 47
Antigüedad: 14 años, 3 meses
Puntos: 1
Respuesta: Llenar progresivamente un JTable

Hola, no se si esto te servira de ayuda, o si te llegara tarde.

Lo acabo de probar con una tabla de 300.000 registros y funciona sin problema.

Se basa en "scrollable cursors"
En este enlace
http://www.froses.com/Assets/Files/A...bleModels2.pdf
tienes un documento donde se explica.

y en este otro
http://www.javahispano.org/forum/j2s...rancesc_roses/
los ejemplos

Espero que te sirva
  #9 (permalink)  
Antiguo 26/03/2011, 07:42
Avatar de sivadmp  
Fecha de Ingreso: febrero-2011
Ubicación: La Paz - Bolivia
Mensajes: 293
Antigüedad: 13 años, 9 meses
Puntos: 20
Respuesta: Llenar progresivamente un JTable

hola Tronco, por que no utilizas la misma logica de los sitios web

es decir limitar la lista y colocar los botones de siguiente y atras, para que se vuelva a cargar los datos de la BD

saludos
__________________
agradecer no cuesta nada
Entre más información proporciones más fácil será ayudarte, y asi evitar adivinar el problema con el que cuentas.
  #10 (permalink)  
Antiguo 02/06/2011, 09:20
 
Fecha de Ingreso: noviembre-2010
Ubicación: Tandil
Mensajes: 79
Antigüedad: 14 años
Puntos: 3
Respuesta: Llenar progresivamente un JTable

Hola amigos, recién veo los mensajes porque creí que había puesto Notificación instantánea por mail, pero no fue así. Ahora me instalé el Google Chrome y estoy utilizando la extensión de FDW, es fantástico.
Ahora si:
- Oasis8, gracias por esta valiosa info. La voy a investigar.
- sivadmp, gracias, pero esta lógica no me sirve, como expliqué más arriba, necesito que el usuario vea todos los datos a la vez, por eso no me sirven los botones de ANTERIOR y SIGUIENTE.

Muchas gracias a los dos. Saludos.
  #11 (permalink)  
Antiguo 03/06/2011, 09:00
 
Fecha de Ingreso: noviembre-2010
Ubicación: Tandil
Mensajes: 79
Antigüedad: 14 años
Puntos: 3
Respuesta: Llenar progresivamente un JTable

Oasis8, de nuevo yo. Estuve investigando la clase que me indicaste y la verdad es que mejora notablemente los tiempos (en mi caso mejoró un 80%). Si bien tiene sus limitaciones, creo que se puede seguir trabajando un poco más esta clase para agregarle algunas cosas, como por ejemplo columnas calculadas, o setearle los nombres y el ancho a las columnas; pero es un gran comienzo. Muchas gracias !!!
  #12 (permalink)  
Antiguo 16/06/2011, 15:41
 
Fecha de Ingreso: noviembre-2010
Ubicación: Tandil
Mensajes: 79
Antigüedad: 14 años
Puntos: 3
Respuesta: Llenar progresivamente un JTable

Hola Oasis8 y todos los interesados. Después de golpearme la cabeza contra la pared logré setearle los anchos y los nombres de las columnas y además, logré agregar columnas con campos calculados a partir de los datos de las otras columnas. La única desventaja es que al momento de darle clic a un título para ordenar los datos de esa columna, recalcula todos los datos nuevamente, y si la tabla contiene muchos registros, tarda un tiempo bastante elevado, pero salvando eso, me funcionó perfectamente.
Además logré en una columna agregarle, por ejemplo, una fecha y luego poder ordenarla.
Esta clase es realmente fantástica.

Si alguien está interesado en la solución que encontré, no duden en enviarme un mail a [email protected].
Como siempre, forosdelweb al pie del cañón !!!
Saludos a todos.
  #13 (permalink)  
Antiguo 18/06/2011, 08:00
Avatar de SPAWN3000  
Fecha de Ingreso: marzo-2008
Ubicación: Bogota
Mensajes: 858
Antigüedad: 16 años, 8 meses
Puntos: 15
Respuesta: Llenar progresivamente un JTable

NO LEY MUY DETENIDAMENTE POR TIEMPO...Pero de algo te podria servir mi aporte.

En una aplicación empresarrial no es recomendable lo que deseas implementar.

1. CASO 1:Si necesitas ir mostrando registro a registro(Antes de recuperar todos los registros en la aplicacion), a la vez que una barra de progreso o algo por el estilo...necesitas un hilo entre tu aplicacion y el resto de procesos, esto indicaria que debes estar haciendo varias peticiones al servidor de base de datos lo que indica una baja granulacion, pero aumentar significativamente la lentitud de tu aplicación.

2. CASO 2:El uso mas eficiente siempre son los procedimientos almacenados(No existe aplicacion que pueda competir contra la velocidad de la base de datos), (200.000 registros no son mucho si la consulta esta bien planteada-Bien indexada(Index hint), +un correcto plan de ejecución de consultas).

Ahora para llenar la tabla despues de recuperados todos los registros, los hilos implican un aumento del tiempo ya que estos implican ceder un lapso de tiempo a otras tareas en el PC.

La paginacion es una buena alternativa...

Te comparto este link que podria serte informacion muy valiosa, hay un ejemplo que puede descargar...
http://java.sun.com/products/jfc/tsc...ChristmasTree/


Saludos,

Última edición por SPAWN3000; 18/06/2011 a las 08:15
  #14 (permalink)  
Antiguo 21/06/2011, 16:14
 
Fecha de Ingreso: noviembre-2010
Ubicación: Tandil
Mensajes: 79
Antigüedad: 14 años
Puntos: 3
Respuesta: Llenar progresivamente un JTable

Hola, SPAWN3000. Muchas gracias por la info. El caso 1 lo tengo claro. Y con respecto al caso 2, lo voy a investigar un poco más, porque es interesante. Ya había leído algo acerca de los procedimientos almacenados, pero nunca me puse a hacer uno. Lo voy a probar.
Muchas gracias. Saludos.
  #15 (permalink)  
Antiguo 19/03/2013, 18:03
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años, 7 meses
Puntos: 6
Respuesta: Llenar progresivamente un JTable

SPAWN3000 despertaste mucho mi interés porque hace tiempo que quiero hacer una paginación al JTable.
y quería pedirte un ejemplo hecho de paginación.
También me llamo mucho la atención el pdf que pusiste del cual estoy interesado de ver un ejemplo hecho de eso.

puedes hacerme ese gran favor porque quiero acelerar la carga de mi jtable por la gran cantidad de datos q tenga q cargar desde mi colección.

si puedes y lo haces, te lo agradezco.

Etiquetas: jtable, llenar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 16:15.