Cuando se usa JDBC para conectarse a la base de datos MySQL para la inserción de datos, especialmente los lotes grandes de datos se insertan continuamente (100,000). ¿Cómo mejorar la eficiencia?
Hay dos métodos de declaración en la interfaz de programación JDBC que son particularmente notables:
El procesamiento por lotes de los datos se puede lograr utilizando addBatch() y executeBatch() .
Sin embargo, vale la pena señalar que primero debe configurar una confirmación manual en el enlace de la base de datos, connection.setAutoCommit(false) y luego ejecutar connection.commit() después de ejecutar la declaración.
import java.io.bufferedReader; import java.io.ioException; import java.sql.drivermanager; import java.sql.preparedStatement; import java.sql.sqlexception; import java.util.date; import Com.mysql.jdbc.conconnection; public class mysqlbatchutil {Striegil {" DB_TEST (param1, param2, param3, param4, param5) valores (?,?,?,?,?) "; String private Charset = "UTF-8"; Private String Connectstr = "JDBC: mysql: // localhost: 3306/test"; String private UserName = "root"; String private Password = "123456"; Private void dostore () lanza ClassNotFoundException, SQLException, ioException {class.forname ("com.mysql.jdbc.driver"); ConnectStr += "? UseerverPrepstmts = false & rewritebatchedStatements = true"; // Aquí hay una prueba de inserción de lotes eficiente, y la inserción de lotes normal se elimina después de la conexión de ejecución conn = (Connection) Drivermanager.getConnection (ConnectStr, UserName, contraseña); conn.setAutOcommit (falso); // Establecer envío manual int count = 0; Preparado PSTS = Conn.PrepareStatement (SQL); Línea de cadena = nulo; Fecha de inicio = nueva fecha (); para (int i = 0; i <= 100000; i ++) {psts.setstring (1, i+"param1"); psts.setString (2, i+"param2"); psts.setString (3, i+"param3"); psts.setString (4, i+"param4"); psts.setString (5, i+"param5"); psts.addbatch (); // Agregar recuento de procesamiento por lotes ++; } psts.executeBatch (); // ejecutar el procesamiento por lotes conn.commit (); // Enviar fecha final = nueva fecha (); System.out.println ("cantidad ="+count); System.out.println ("runtime ="+(end.gettime ()-begin.gettime ())); conn.close (); } public static void main (string [] args) {try {new MySqlBatchUtil (). Dostore (); } catch (ClassNotFoundException e) {E.PrintStackTrace (); } Catch (Sqlexception e) {E.PrintStackTrace (); } catch (ioException e) {E.PrintStackTrace (); }}}Resultados de la prueba:
Cantidad = 100001
Tiempo de ejecución = 4725
Un total de 10W, y el tiempo de ejecución tarda 47 segundos.
Esta eficiencia aún no es alta y no parece lograr el efecto deseado y necesita una mejora adicional.
Los parámetros también se pueden agregar a la cadena de conexión MySQL JDBC.
ReWritebatchedStatements = True
MySQL ha desactivado el procesamiento por lotes de forma predeterminada, y se enciende a través de este parámetro. Este parámetro puede reescribir la instrucción SQL enviada a la base de datos.
UsseerverPrepstmts = falso
Si no está habilitado (UseServerPrepstmts = false), use com.mysql.jdbc.PreparedStatement para el ensamblaje SQL local, y finalmente envíelo a DB. Es el SQL final que ha sido reemplazado.
Aquí hay una pequeña mejora, agregue la siguiente declaración a la cadena de conexión (elimine los comentarios en el constructor de código):
ConnectStr += "? UseerverPrepstmts = false & rewritebatchedStatements = true";
Los resultados de la prueba son los siguientes:
Cantidad = 100001
Tiempo de ejecución = 1213
Con la misma cantidad de datos, esta vez solo tardó 12 segundos en ejecutarse, lo que muestra que la eficiencia del procesamiento ha mejorado considerablemente. Ja ja
Lo anterior es la eficiencia de prueba del uso de JDBC para insertar 10W piezas de datos en lotes de la base de datos MySQL. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje y el editor responderá a todos a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!