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.
Ejemplo Insert por lotes
Dado una tabla «alumno» de nuestra base de datos «TutorialJava» :
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:
enjoy!
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! :)
Un Tabbed Activity te permite cambiar la vista entre fragmentos desplazando el dedo de izquierda a derecha o de derech...
En este post veremos una forma de realizar la paginación en una base de datos Access utilizando el lenguaje de programac...
DOM4J es una de las librerías para java más populares para el trabajo con XML ya que nos permite crea, editar y leer doc...
En este post desarrollaremos una aplicación que nos permitirá leer un código QR y capturar la información que contiene y...
PlaceHolder: PlaceHolder es un atributo propio de HTML5 y es el texto que aparece dentro de un campo de texto (un JTextF...
En este post mostramos como personalizar el Header (encabezado) de un componente JTable en Java colocando iconos, centra...
El gigante tecnologico Google a puesto un bonito Doodle en su buscador que esta fascinando a sus millones de usuarios qu...
WhatsApp anuncio a través de su blog que ya se encuentra disponible la función de envío de fotos y videos TEMPORALES, es...
Muchas de las innovaciones computacionales de la NASA se desarrollaron para ayudar a explorar el espacio, pero ahora la...
TikTok es una plataforma de microvideos muy popular entre los jóvenes el cual cuenta ya con millones de videos cortps de...