Ir al contenido principal

Statement (addBatch, executeBatch, clearBatch): Ejecutar insert, update por lotes

Ejecutar sentencias por lotes.

Nos basaremos para el ejemplo en tres métodos de Statement:

  • addBatch(String sentencia). Añade una sentencia a la lista de sentencias por lotes.
  • executeBatch(). Ejecuta la lista de sentencias por lotes. Retorna un array de enteros con el resultado de cada sentencia.
  • clearBatch(). Limpia la lista de sentencias por lotes.
Si tenemos la intención de realizar varias sentencias INSERT o UPDATE consecutivas, es mucho más eficiente utilizar la ejecución de sentencias por lotes que enviar las sentencias una por una.

Creamos un método que reciba una lista de sentencias y las ejecuta por lotes:

public int[] ejecutaPorLotes(List sentencias) {
        Connection conn = getConnection();
        int[] resultado = null;
        Statement st = null;
        try {
            st = conn.createStatement();
            for (int i = 0; i < sentencias.size(); i++) {
                String sentencia = (String) sentencias.get(i);
                st.addBatch(sentencia);
            }
            resultado = st.executeBatch();
            st.clearBatch();
            return resultado;
        } catch (SQLException e) {
            e.printStackTrace();
            return resultado;
        } finally {
            if (st != null) {
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }        

        }

    }

Vamos a probar el código:

public static void main(String[] args) {
        
        CaracteristicasJDBC car = new CaracteristicasJDBC();
        
        ArrayList lista = new ArrayList();
        lista.add("INSERT INTO USUARIOS VALUES ('Pepe',19)");
        lista.add("INSERT INTO USUARIOS VALUES ('Juan',21)");
        
        int[] resultado = car.ejecutaPorLotes(lista);
        
        for(int i=0;i
            System.out.println("resultado: "+resultado[i]);
        }

    }

Ejecutamos y vemos la consola:

Resultado

Comprobamos los datos en la tabla:

datos

Comentarios

  1. Hola.

    Yo no se si lo estoy haciendo bien, pero hago lo mismo, y funcionar funciona, pero tengo la sensación de que se está introduciendo en la bbdd un solo campo a la vez ... luego es muuuuy lento

    Este es mi código:

    public void insertarDatos (ArrayList lista){

    Connection connection = null;
    PreparedStatement statement = null;
    try {
    connection = getCx();
    statement = connection.prepareStatement("INSERT INTO logs (ip,time,request,referer,httpcode) VALUES (?,?,?,?,?)");
    for (int i = 0; i < lista.size(); i++) {
    BeanLog bl = (BeanLog)lista.get(i);
    statement.setString(1, bl.getIp());
    statement.setString(2, bl.getTime());
    statement.setString(3, bl.getRequest());
    statement.setString(4, bl.getReferer());
    statement.setInt(5, bl.getHttpcode());
    statement.addBatch();
    if ((i + 1) % 1000 == 0) {
    statement.executeBatch(); // Ejecuto cada 1000 items.
    }
    }

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

Java POI HSSFCell : añadir comentario en una celda

POI HSSFComment: Una manera simple de añadir un comentario en una celda de excel usando el metodo cell.setCellComment(). public class ExcelTools { public static void main(String[] args){ //escribirExcel(); //leerExcel(); validarValoresDuplicadosLista(); System.out.println("Ejemplo Finalizado."); } public static void escribirExcel(){ try{ //Se crea el libro Excel HSSFWorkbook wb = new HSSFWorkbook(); //Se crea una nueva hoja dentro del libro HSSFSheet sheet = wb.createSheet("HojaEjemplo"); //Se crea una fila dentro de la hoja HSSFRow row = sheet.createRow((short)0); HSSFPatriarch patr = sheet.createDrawingPatriarch(); //Creamos celdas de varios tipos row.createCell((short)0).setCellValue(1); row.createCell((short)1).setCellValue(1.2); row.createCell((short)2).setCellValue("ejemplo&

Debugging Remoto con Eclipse + WebSphere 7 + Maven

Tienes proyectos java en Maven y no puedes ubicar bugs fácilmente a falta de junit. Sin embargo, existe la alternativa de debugear la aplicación web a través de Java Debugger (jdb). Aquí les muestro una guía de como hacer un debug remoto de la aplicación web en Eclipse y WebSphere 7 a través de Java Debugger (JDB). Eclipse <----> Java Debugger (jdb) <----> WebSphere 7 1. Habilitar el WebSphere en modo Debug. Para esto seguir los siguientes pasos:  1. Servers –> Server Types –> WebSphere application servers 2. Under Server Infrastructure section –> expandir Java and Process Management –> Process definition 3. dentro de la seccion Additional Properties –> click Java Virtual Machine 4. clic en el check “Debug Mode” 5. En texbox Debug arguments, poner este valor:  -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8888 6. Reiniciar el servidor WebSphere. Ahora, WebSphere se inicia en modo debug, y escuchando en el pu

DB2 Error SQL20054N

Ejecutando un alter table me da el  siguiente error: db2 "ALTER TABLE PRG_REC.ESTIMADO_OBJETIVO DROP COLUMN VTA_OBJ_CAMP_FALTA_EXTRANJERA"; Error:  [db2inst1@ibmdb2test]:/home/db2inst1/1223/REQ1223/rollback$ db2 "ALTER TABLE PRG_REC.ESTIMADO_OBJETIVO DROP COLUMN VTA_OBJ_CAMP_FALTA_EXTRANJERA"; DB21034E  The command was processed as an SQL statement because it was not a valid Command Line Processor command.  During SQL processing it returned: SQL20054N  The table "PRG_REC.ESTIMADO_OBJETIVO" is in an invalid state for the operation.  Reason code="23" .  SQLSTATE=55019 Segun IBM la descripcion del error: SQL20054N:  La tabla   nombre-tabla   está en un estado no válido para la operación. Código de razón= código-razón . 23 Se ha realizado el número máximo de modificaciones recomendadas de REORG. Se permite un máximo de tres modificaciones recomendadas de REORG en una tabla antes de que se deba realizar reorg, para actualizar las fila