Ao usar o JDBC para conectar -se ao banco de dados MySQL para inserção de dados, especialmente lotes grandes de dados são inseridos continuamente (100.000). Como melhorar a eficiência?
Existem dois métodos de declaração na interface de programação JDBC que são particularmente dignos de nota:
O processamento de dados em lote pode ser alcançado usando addBatch() e executeBatch() .
No entanto, vale a pena notar que primeiro você precisa configurar uma confirmação manual no link do banco de dados, connection.setAutoCommit(false) e, em seguida, execute connection.commit() após a execução da instrução.
importar java.io.bufferedReader; importar java.io.ioException; importar java.sql.driverManager; importar java.sql.preparedStatement; import java.sql.sqLexception; import java.util.date; mymysql.jdbc.connlection; Em db_test (param1, param2, param3, param4, param5) valores (? ,? ,? ,?) "; private string charset = "utf-8"; Private String ConnectStr = "JDBC: MySQL: // localhost: 3306/teste"; String privada nome de usuário = "root"; private string senha = "123456"; private void Dostore () lança ClassNotFoundException, SQLEXCIPCECTION, IoException {Class.ForName ("com.mysql.jdbc.driver"); ConnectStr += "? UseRerverPrepStmts = false & RewriteBatchedStatements = true"; // Aqui está um teste para inserção eficiente em lote, e a inserção normal em lote é removida após a execução da conexão Conn = (Connection) DriverManager.GetConnection (ConnectStr, UserName, senha); Conn.SetAutocomit (false); // Definir envio manual int conting = 0; Preparado PSTSTEMENT = Conn.Preparestatement (SQL); Linha de string = null; Data BEGIN = new Date (); for (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 (); // Adicione contagem de processamento em lote ++; } psts.executeBatch (); // executar processamento de lote Conn.Commit (); // Data de envio final = new Date (); System.out.println ("quantity ="+count); System.out.println ("RunTime ="+(end.gettime ()-BEGN.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 do teste:
Quantidade = 100001
Tempo de execução = 4725
Um total de 10W e o tempo de execução leva 47 segundos.
Essa eficiência ainda não é alta e não parece alcançar o efeito desejado e precisa de melhorias adicionais.
Os parâmetros também podem ser adicionados à string de conexão MySQL JDBC.
rewriteBatchedStatements = true
O MySQL desligou o processamento do lote por padrão e está ligado a esse parâmetro. Este parâmetro pode ser reescrito a instrução SQL enviada ao banco de dados.
usaRerverPrepStmts = false
Se não estiver ativado (useServerPrepStmts = false), use com.mysql.jdbc.preparedStatement para montagem SQL local e, finalmente, envie -o para DB. É o SQL final que foi substituído.
Aqui está uma pequena melhoria, adicione a seguinte instrução à string de conexão (remova os comentários no construtor de código):
ConnectStr += "? UseRerverPrepstmts = false & rewriteBatchedStatements = true";
Os resultados dos testes são os seguintes:
Quantidade = 100001
Tempo de execução = 1213
Com a mesma quantidade de dados, desta vez levou apenas 12 segundos para executar, o que mostra que a eficiência do processamento foi bastante aprimorada. Haha
O exposto acima é a eficiência do teste do uso do JDBC para inserir dados de 10W em lotes de banco de dados MySQL. Espero que seja útil para todos. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a todos a tempo. Muito obrigado pelo seu apoio ao site wulin.com!