Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Java / Procesamiento por lotes [Batch insert]

Procesamiento por lotes [Batch insert]

Autor jc mouse miércoles, mayo 29, 2019

En ocasiones debemos insertar varios registros a nuestra base de datos desde nuestra aplicación java y lo que usualmente se hace es enviar cada instrucción SQL insert por separado, algo que no es eficiente ya que se pierde tiempo en cada llamada a la base de datos, claro esta que con 10 insert no existe mayor problema pero con 1000 ó 10000 llamadas a la base de datos si. Entonces lo que debemos hacer es optimizar estos insert en una sola llamada y esto se logra mediante el procesamiento por lotes o BATCH.

MariaDB

Ejemplo Insert por lotes

Dado una tabla «alumno» de nuestra base de datos «TutorialJava» :

estudiante

Se quiere agregar a la base de datos N registros de alumnos almacenados en un array utilizando el procesamiento por lotes.

Solución:

Se crea un PreparedStatement como suele hacerse para cualquier otro arrays de insert, la diferencia se encuentra en que en lugar de ejecutar individualmente cada llamada a la base de datos, se almacenan los insert utilizando el método addBatch() hasta completar un lote definido por nosotros (para este ejemplo es de 10). Una vez llenamos el lote ejecutamos el mismo mediante executeBatch(), si aun quedan elementos en el array se repetirá el proceso.

Finalmente se realiza un commit() para confirmar la transacción.

Código:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
 * @see https://www.jc-mouse.net/
 * @author mouse
 */
public class Main {

    public static void main(String[] args) throws SQLException {
        Connection connection = conectar("jdbc:mariadb://localhost:3306/TutorialJava", "root", "");
        PreparedStatement statement = null;
        final int batchSize = 10;
        int count = 0;//contador de lotes
        int batch = 1;//numero de lotes
        if (connection != null) {
            try {
                connection.setAutoCommit(false);
                // El Prepared Statement para los insert
                statement = connection.prepareStatement("INSERT INTO alumno (nombre,mail) VALUES (?,?)");

                // Se añaden los datos al batch
                for (String[] dato : alumnos()) {
                    statement.setString(1, dato[0]);
                    statement.setString(2, dato[1]);
                    System.out.printf("> Registro ( %s | %s ) agregado al lote #%s\n", dato[0], dato[1], batch);
                    statement.addBatch();

                    //Se van diviendo los lotes segun un limite establecido
                    if (++count % batchSize == 0) {
                        //se ejecuta lote #N
                        statement.executeBatch();
                        System.out.printf("> Ejecutando lote #%s\n", batch);
                        batch++;
                    }
                }
                
                //Se ejecuta el lote restante
                if (alumnos().length % batchSize != 0) {
                    System.out.printf("> Ejecutando lote #%s\n", batch);
                    statement.executeBatch();
                }

                //confirma transacción
                connection.commit();
                System.out.printf("> TOTAL: [ %s ] alumnos registrados\n", alumnos().length);
                System.out.println("> Programa terminado");
            } catch (SQLException ex) {//si se produce algun error
                System.err.println(ex.getMessage());
                try {
                    System.err.println("> Transacción abortada");
                    System.err.println("> Valores restaurados");
                    System.err.println("> Programa terminado");
                    connection.rollback();
                } catch (SQLException ex1) {
                    System.err.println(ex1.getMessage());
                }
            } finally {
                if (statement != null) {
                    statement.close();
                }
            }
        }
    }

    /**
     * Datos de alumnos a registrar
     *
     * @return String
     */
    public static String[][] alumnos() {
        String[][] data = {
            {"Jorge Nitales", "jorge_n@mail.com"},
            {"Elsa Porrico", "elpo@mail.com"},
            {"Zampa Teste", "zzpa@mail.com"},
            {"Rosamel Fierro", "rosfie@mail.com"},
            {"Luz Rojas", "luzro@mail.com"},
            {"Elsa Podiondo", "els_ondo@mail.com"},
            {"Armando Casas", "arm_casas@mail.com"},
            {"Aquiles Baeza ", "aquiza@mail.com"},
            {"Mary Conazo ", "marzo@mail.com"},
            {"Elma Montt", "elmtt_1@mail.com"},
            {"Lucho Pay", "lucy__pay@mail.com"},
            {"Yola Prieto", "yolto@mail.com"},
            {"Lola Mento", "lolme07@mail.com"},
            {"Cindy Nero", "ci_nro23@mail.com"},
            {"Rosa Melpito", "rospito@mail.com"},
            {"Martin Cabezon", "marzonq@mail.com"},
            {"Email Suarez", "emaez@mail.com"},
            {"Aquiles Castro", "aquistro@mail.com"}
        };
        return data;
    }

    public static Connection conectar(String url, String user, String pass) {
        try {
            Connection connection = DriverManager.getConnection(url, user, pass);
            System.out.println("> Conectado a la base de datos");
            return connection;
        } catch (SQLException ex) {
            System.err.println(ex.getMessage());
        }
        return null;
    }
}

Ejecutamos nuestra clase y tenemos:

batch insert

enjoy!

Tags

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!
Autor: JC Mouse

Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.

Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye

Enjoy! :)

También Te Podría Interesar

Introducción a la edición de imágenes con ImageMagick

Introducción a la edición de imágenes con ImageMagick

ImageMagick es un software de código abierto multiplataforma que contiene una serie de herramientas para leer, mostrar,...

Proyecto Base de Datos Access y Java

Proyecto Base de Datos Access y Java

La base de datos elegida es Access 2007 (*.accdb), pero claro la migracion hacia otra base de datos como MySQL o Postgre...

Gráficos estadísticos con Base de Datos SQLite

Gráficos estadísticos con Base de Datos SQLite

Si necesitamos mostrar gráficos estadísticos en nuestras aplicaciones android, contamos con muchas librerías disponibles...

Seleccionar y mover shapes en html5

Seleccionar y mover shapes en html5

En este tutorial se hará uso de los eventos de ratón de jquery para desplazar shapes sobre el canvas, para tener una mej...

Lenguaje de consultas SQL

Lenguaje de consultas SQL

Para trabajar con los datos de una base de datos, se tiene que utilizar un conjunto de comandos e intrucciones definidos...

Dimask: La mascara de la Belleza (Descargar)

Dimask: La mascara de la Belleza (Descargar)

La Belleza está en la Simetría ¿Qué es lo que nos hace considerar un rostro bello? ¿Está influenciado nuestro criterio p...

Comparte lo que sabes

Categorias

Últimas entradas

En este post, aprenderemos como conectar Visual Basic 6 con SQL Server, abrir una tabla, leer su contenido y mostrar est...

Lo que veremos en este post es la configuración del driver para PHP de SQL Server que ha creado Microsoft el cual permit...

Google Bard la inteligencia artificial de Google se actualiza con una mejora que entra a competir con el resto de IAs y...

El error: Instalaba SQL Server 2008 R2 en español en Windows con el idioma «Español (Bolivia)»y de repente me salio este...

Herramientas

Generador de Enlaces a Whatsapp