L'insertion de gros volumes de données dans une base de données nécessite des opérations d'insertion par lots efficaces. Cependant, il est courant de rencontrer des goulots d’étranglement en matière de performances. Examinons l'optimisation d'une implémentation d'insertion par lots JDBC pour les bases de données MySQL.
Une technique courante consiste à insérer des données par lots en morceaux d'un million de lignes, comme le démontre le code fourni. Cependant, d'après l'extrait de code, le problème reste non résolu.
Une étape cruciale consiste à optimiser la façon dont les instructions préparées sont traitées. Par défaut, MySQL peut créer des instructions préparées côté client, ce qui peut entraîner une surcharge. L'activation de la propriété useServerPrepStmts oblige MySQL à utiliser des instructions préparées côté serveur, qui sont plus efficaces.
MySQL dispose d'une fonctionnalité appelée « réécriture des instructions par lots » qui peut améliorer considérablement l'insertion par lots. performance. Lorsqu'il est activé via la propriété rewriteBatchedStatements, MySQL réécrit les instructions d'insertion individuelles en une seule instruction batch, réduisant ainsi les allers-retours sur le réseau.
Voici l'extrait de code modifié avec les optimisations suggérées :
Connection c = DriverManager.getConnection( "jdbc:mysql://host:3306/db?useServerPrepStmts=false&rewriteBatchedStatements=true", "username", "password" ); ... // Disable auto-commit c.setAutoCommit(false); // Create a prepared statement String sql = "INSERT INTO mytable (xxx), VALUES(?)"; PreparedStatement pstmt = c.prepareStatement(sql); Object[] vals = set.toArray(); for (int i = 0; i < vals.length; i++) { pstmt.setString(1, vals[i].toString()); pstmt.addBatch(); } // Execute the batch int[] updateCounts = pstmt.executeBatch(); System.out.append("inserted " + updateCounts.length);
En appliquant ces optimisations, vous devriez constater une amélioration significative des performances d'insertion par lots JDBC. pour les bases de données MySQL.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!