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

[SOLUCIONADO] Insertar 100.000 registros sin que se cuelgue

Estas en el tema de Insertar 100.000 registros sin que se cuelgue en el foro de Java en Foros del Web. Hola, tengo una aplicación cliente, lo que hace es consumir datos de un web service el cual llega en formato json a la aplicación cliente, ...
  #1 (permalink)  
Antiguo 13/02/2015, 08:57
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 11 meses
Puntos: 12
Insertar 100.000 registros sin que se cuelgue

Hola,

tengo una aplicación cliente, lo que hace es consumir datos de un web service el cual llega en formato json a la aplicación cliente, este inserta todos los registros a la BD, cuando es menos de 25.000 registros no hay problema, el problema esta cuando tenemos cerca de 100.000 registros, la aplicación cliente se detiene.

la forma en como realizo la inserción es mediante un for que realiza el ciclo cuantos registros exista para insertarlo.

Cuando la aplicación se detiene no me muestra ningún error, únicamente se detiene, la BD sigue viva y de los 100.000 registros únicamente habría insertado 40.000.

Se me viene a la cabeza que es un problema de memoria. Pero y, cómo podría controlar este ciclo del for, que otra forma existirá para el registro de los datos que me asegure su completa inserción.

Gracias por su ayuda.
  #2 (permalink)  
Antiguo 13/02/2015, 09:49
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 4 meses
Puntos: 182
Respuesta: Insertar 100.000 registros sin que se cuelgue

Buenas,

A mi me parece mas bien que la conexion con la base de datos se colapsa.

Deberias lanzar los inserts por lotes en lugar de uno a uno. Por ejemplo, puedes ir haciendo lotes de 5000 registros.

Te pongo un ejemplo de como deberia ir tu codigo.

Código Java:
Ver original
  1. PreparedStatement ps = c.prepareStatement("INSERT INTO employees VALUES (?, ?)");
  2.  
  3. int numInserciones = 0;
  4.  
  5. //TU FOR
  6. for (bla bla)
  7.   ps.setString(1, dato1);
  8.   ps.setString(2, dato2);
  9.   ps.addBatch();
  10.  
  11.   if (++numInserciones == 5000) {
  12.     int[] results = ps.executeBatch();
  13.     numInserciones = 0;
  14.   }
  15. }



Un saludo
__________________
If to err is human, then programmers are the most human of us
  #3 (permalink)  
Antiguo 13/02/2015, 10:22
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 11 meses
Puntos: 12
Respuesta: Insertar 100.000 registros sin que se cuelgue

Gracias por responder, la conexión a la BD es JDBC y la BD es DB2 sobre AS400.

No sabía que una conexión pudiera colapsarse o puedo estar entendiendo mal, tomare en cuenta tu sugerencia pero dejo el bucle que uso para la inserción.

Código Java:
Ver original
  1. for (int i = 0; i < msg.size(); i++) {
  2.                     JSONArray msg2 = (JSONArray) msg.get(i);
  3.  
  4.                     String tot =(String)msg2.get(11);
  5.                     String total;
  6.                     if(tot.length() > 4){
  7.                         total = tot.substring(0,tot.length()-2);
  8.                     }else if(tot.length() == 0){
  9.                         total = "0";
  10.                     } else {
  11.                         total = tot;
  12.                     }
  13.                    
  14.                     Double total2 = Double.parseDouble(total);
  15.                     String sql = "insert into TMP263PF ( MPERIODO, MCODREG, MASOCOM, MCENFOC, "
  16.                             + "MUSUARIO, MPRESTAMO, MVPTOT, MFECPROC, MFECAPLI,MTRANSAC,MPOLIZA,MDOCIDE) "
  17.                             + "values ( '"+fecha+"','"+msg2.get(6)+"', '" + msg2.get(7) + "','"+msg2.get(8)+"', '" +
  18.                             msg2.get(9) + "', '" + msg2.get(10) + "', " + total2 + ",'"+fechaActual+"','','','','' )";
  19.                     System.out.println(sql);
  20.                     s.execute( sql );
  21.                 }  
  22.                 s.close();
  23.                 JOptionPane.showMessageDialog(null, "Los datos fueron guardados correctamente");
  #4 (permalink)  
Antiguo 13/02/2015, 12:04
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 4 meses
Puntos: 182
Respuesta: Insertar 100.000 registros sin que se cuelgue

Buenas,

No se si es eso lo que te pasa, pero si a un sistema al que te conectas le envias 100.000 peticiones en unos de segundos, lo normal es que acabe haciendo un DoS.

Como te comentaba, lo mejor es que refactorices el código como te indico más arriba. De esa forma en lugar de 100.000 peticiones haras 20.


Un saludo
__________________
If to err is human, then programmers are the most human of us
  #5 (permalink)  
Antiguo 13/02/2015, 14:02
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 11 meses
Puntos: 12
Respuesta: Insertar 100.000 registros sin que se cuelgue

Muchas gracias por la ayuda

Etiquetas: cuelgue, registros
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




La zona horaria es GMT -6. Ahora son las 17:08.