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