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

Problemas de tiempo al hacer insert masivos sobre una tabla temporal oracle

Estas en el tema de Problemas de tiempo al hacer insert masivos sobre una tabla temporal oracle en el foro de Java en Foros del Web. Wenas. Tengo el siguiente codigo Código: public void rellenaTablaTemporal (Connection con, ArrayList lista) throws SQLException { System.out.println("bd.inicio" + new java.util.Date()); String consulta = "INSERT INTO ...
  #1 (permalink)  
Antiguo 19/06/2009, 05:43
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 2 meses
Puntos: 10
Problemas de tiempo al hacer insert masivos sobre una tabla temporal oracle

Wenas.

Tengo el siguiente codigo

Código:
    public void rellenaTablaTemporal (Connection con, ArrayList lista) throws SQLException
    {
        System.out.println("bd.inicio" + new java.util.Date());

        String consulta = "INSERT INTO CONTAB_TMP_MOVIMIENTOS (ANIO, CTA, DEB_HAB, IMPORTE) VALUES (?,?,?,?)";
        PreparedStatement ps = con.prepareStatement(consulta);
        TablaHash tabla = null;
        if (lista.size() > 0)
        {
          for (int i=0;i<lista.size();i++) 
          {
            tabla = (TablaHash) lista.get(i);    
              ps.setInt(1,tabla.getInt("anio"));
              ps.setString(2,tabla.getString("cta",""));
              ps.setString(3,tabla.getString("debehab",""));
              ps.setFloat(4, tabla.getFloat("total"));
             ps.executeUpdate();
          }
             con.commit();
              ps.close();

        }
        System.out.println("bd.fin" + new java.util.Date());

    }
El cual se encarga de hacer insert masivos sobre una tabla temporal. Los registros vienen en el ArrayList lista. Estos datos se han obtenido previamente de otra base de datos SQLServer.
TablaHash es una Hashtable 'tuneada' para obtener los valores de esos registros.

El problema como podeis imaginar esta en los tiempos. Con pocos registros esto es inmediato, pero a partir de los 5000 registros crece bastante.
En concreto con 7000 registros esta en torno a los 17 segundos (segundo arriba segundo abajo). Esto para el usuario es inadmisible.

Me podriais ayudar a reducir este tiempo?? O en cambio le pongo un mensaje al usuario diciendole que se vaya a tomar un cafe?? :D

Gracias.

elAntonie.

PD. Con hibernate el tiempo es similar.

Última edición por elAntonie; 19/06/2009 a las 05:55
  #2 (permalink)  
Antiguo 21/06/2009, 09:30
 
Fecha de Ingreso: abril-2009
Mensajes: 82
Antigüedad: 15 años
Puntos: 2
Respuesta: Problemas de tiempo al hacer insert masivos sobre una tabla temporal oracl

Buenas:

La única cosa que se me ocurre para que tu inserción sea más rápida es que crees un lote de sentencias y las ejecutes todas a la vez, quizá te ahorre tiempo ya que así los ejecutas todos a la vez y no uno a uno.

Espero que te sirva ;) Saludos
  #3 (permalink)  
Antiguo 21/06/2009, 20:02
Avatar de alfcm  
Fecha de Ingreso: mayo-2009
Mensajes: 291
Antigüedad: 15 años
Puntos: 7
Respuesta: Problemas de tiempo al hacer insert masivos sobre una tabla temporal oracl

Yo tambien tambien buscaba la solucion pero como eran pocos los registros que tenia que insertar, entonces hacia como lo antony muestra en su codigo, pero bueno hasta ahora no encuentro como lo haria si se me presentara algun dia un caso como el de antony, intentaba concatenar en una sola cadena los insert pero no me salia ya que me no sabia como manejar dentro del FOR O WHILE:

String consulta = "INSERT INTO CONTAB_TMP_MOVIMIENTOS (ANIO, CTA, DEB_HAB, IMPORTE) VALUES (?,?)";
ps.setInt(1,tabla.getInt("anio"));
ps.setString(2,tabla.getString("cta",""));

para que cuando termminara el bucle y saliendo de esta hiciera el execute:
ps.executeUpdate();

Quizas Antonie tu lo puedas resolver o en todo caso los amigos foristas sigan dando mas ideas de como resolver..

Suerte
  #4 (permalink)  
Antiguo 22/06/2009, 02:08
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 2 meses
Puntos: 10
Respuesta: Problemas de tiempo al hacer insert masivos sobre una tabla temporal oracl

Gracias a los 2, squar me ha puesto sobre la pista al decir lo del bloque de sentencias. La solucion la proporciona el propio PreparedStatement.

Para ejecutar bloques esta addBatch. Este es el codigo definitivo.

Código:
    public void rellenaTablaTemporal (Connection con, ArrayList lista) throws SQLException
    {
        System.out.println("bd.inicio" + new java.util.Date());

        String consulta = "INSERT INTO CONTAB_TMP_MOVIMIENTOS (ANIO, CTA, DEB_HAB, IMPORTE) VALUES (?,?,?,?)";
        PreparedStatement ps = con.prepareStatement(consulta);
        TablaHash tabla = null;
          for (int i=0;i<lista.size();i++)
          {
                tabla = (TablaHash) lista.get(i);    
                ps.setInt(1,tabla.getInt("anio"));
                ps.setString(2,tabla.getString("cta",""));
                ps.setString(3,tabla.getString("debehab",""));
                ps.setFloat(4, tabla.getFloat("total"));
                ps.addBatch();
          }
        ps.executeBatch();
        con.commit();
        ps.close();
        System.out.println("bd.fin" + new java.util.Date());

    }
Se ha reducido de 17 segundos a ser casi inmediato. Es lo que tiene la edad, uno olvida cosas.

Gracias a los 2.

Saludos.
  #5 (permalink)  
Antiguo 22/06/2009, 21:27
Avatar de alfcm  
Fecha de Ingreso: mayo-2009
Mensajes: 291
Antigüedad: 15 años
Puntos: 7
Respuesta: Problemas de tiempo al hacer insert masivos sobre una tabla temporal oracl

Buena Antonie.. que bueno que lo resolviste y para mi tambien en algun dia me pueda servir ante un caso parecido

Saludos
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 09:00.