Lorsque vous utilisez JDBC pour se connecter à la base de données MySQL pour l'insertion de données, les lots de données importants sont entièrement insérés en continu (100 000). Comment améliorer l'efficacité?
Il existe deux méthodes d'énoncé dans l'interface de programmation JDBC qui sont particulièrement remarquables:
Le traitement par lots des données peut être obtenu en utilisant addBatch() et executeBatch() .
Cependant, il convient de noter que vous devez d'abord configurer un engagement manuel dans le lien de la base de données, connection.setAutoCommit(false) , puis exécuter connection.commit() après l'exécution de l'instruction.
Importer 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.connection; classe publique mysqlbratch {private sringle SQL = "INSERT dans DB_TEST (param1, param2, param3, param4, param5) (?,? ,?,?)"; String privé charset = "utf-8"; String privé ConnectStr = "JDBC: mysql: // localhost: 3306 / test"; Nom de chaîne privée = "root"; Private String Password = "123456"; private void dostore () lève classNotFoundException, sqlexception, ioException {class.forname ("com.mysql.jdbc.driver"); ConnectStr + = "? USETERVERPREPSTMTS = FALSE & REWRITEBATCHEDSTATSESS = TRUE"; // Voici un test pour une insertion de lots efficace, et l'insertion de lots normale est supprimée après la connexion d'exécution Conn = (Connexion) driverManager.GetConnection (ConnectSstr, nom d'utilisateur, mot de passe); Conn.SetAutoCommit (false); // Définir la soumission manuelle int count = 0; PREATYSATSATION PSTS = Conn.PrepareStatement (SQL); Chaîne line = null; Date début = new Date (); for (int i = 0; i <= 100000; i ++) {pst.SetString (1, i + "param1"); PST.SetString (2, i + "param2"); PSTS.SetString (3, i + "param3"); PSTS.SetString (4, i + "param4"); PST.SetString (5, i + "param5"); PST.ADDBATCH (); // Ajouter le nombre de traitements par lots ++; } PST.ExecuteBatch (); // Exécuter le traitement par lots Conn.Commit (); // Soumettre la date fin = new Date (); System.out.println ("Quantity =" + Count); System.out.println ("runtime =" + (end.gettime () - begin.getTime ())); conn.close (); } public static void main (string [] args) {try {new mysqlbatchutil (). dStore (); } catch (classNotFoundException e) {e.printStackTrace (); } catch (sqlexception e) {e.printStackTrace (); } catch (ioException e) {e.printStackTrace (); }}}Résultats des tests:
Quantité = 100001
Temps de fonctionnement = 4725
Un total de 10 W, et le temps d'exécution prend 47 secondes.
Cette efficacité n'est toujours pas élevée et ne semble pas atteindre l'effet souhaité et nécessite une amélioration supplémentaire.
Les paramètres peuvent également être ajoutés à la chaîne de connexion MySQL JDBC.
RewriteBatchEdStatements = True
MySQL a désactivé le traitement par défaut par défaut, et il est activé par ce paramètre. Ce paramètre peut être réécrit l'instruction SQL soumise à la base de données.
useserverprepstmts = false
S'il n'est pas activé (useerverprepstmts = false), utilisez com.mysql.jdbc. C'est le SQL final qui a été remplacé.
Voici une petite amélioration, ajoutez l'instruction suivante à la chaîne de connexion (supprimez les commentaires dans le constructeur de code):
ConnectStr + = "? UsingerverPrepStmts = false & rewriteBatchEdStatements = true";
Les résultats des tests sont les suivants:
Quantité = 100001
Temps de fonctionnement = 1213
Avec la même quantité de données, cette fois, il n'a fallu que 12 secondes pour exécuter, ce qui montre que l'efficacité de traitement a été considérablement améliorée. Haha
Ce qui précède est l'efficacité de test de l'utilisation de JDBC pour insérer des données 10W dans les lots de base de données MySQL. J'espère que ce sera utile à tout le monde. Si vous avez des questions, veuillez me laisser un message et l'éditeur répondra à tout le monde à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!