Puede utilizar insertos lotes JDBC.
PreparedStatement ps = cn.prepareStatement("INSERT INTO....");
for (int i = 0; i < 1000; i++) {
ps.setString(1, "value-" + i); // Set values
ps.addBatch(); // Add this to the batch
ps.clearParameters(); // Reset the parameters
}
ps.executeBatch();
Sin embargo MySQL no soporta la funcionalidad de lote de forma nativa, así que para obtener un rendimiento razonable, necesitará añadir rewriteBatchedStatements=true
a la configuración JDBC de MySQL.
También hay una sintaxis de inserción por lotes específica de MySQL que puede usar si desea crear una cadena de SQL grande. Intentaría ambos y probaría el rendimiento.
INSERT INTO x (a,b)
VALUES ('1', 'one'),
('2', 'two'),
('3', 'three');
Tenga cuidado con ambos enfoques, ya que puede exceder el tamaño máximo de paquete para una sola solicitud. Es posible que deba establecer un tamaño de lote que sea diferente al número de entradas en su búfer. P.ej. es posible que necesite dividir 1000 entradas en 10 lotes de 100.
Utilice este enfoque con precaución. He visto sistemas que han hecho esto en el pasado y el costo de crear el archivo intermedio y enviarlo al servidor ha superado los beneficios de rendimiento del uso de la operación de carga rápida de archivos. –
Parece muy peligroso ya que tenemos dos servidores de aplicaciones que acceden simultáneamente a la misma base de datos. Realmente temía que surgiera esa respuesta. Gracias a todos por su respuesta. –