Maison >base de données >tutoriel mysql >Comment puis-je optimiser les insertions par lots JDBC pour MySQL afin d'améliorer les performances ?

Comment puis-je optimiser les insertions par lots JDBC pour MySQL afin d'améliorer les performances ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-25 03:08:09804parcourir

How Can I Optimize JDBC Batch Inserts for MySQL to Improve Performance?

Amélioration des performances d'insertion par lots JDBC pour MySQL

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.

Optimisation des instructions préparées côté serveur

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.

Réécriture des instructions par lots

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.

Extrait de code modifié avec optimisation

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn