Je veux insérer plusieurs lignes dans une table MySQL à la fois en utilisant Java. Le nombre de lignes est dynamique. Dans le passé, je faisais ...
for (String element : array) {
myStatement.setString(1, element[0]);
myStatement.setString(2, element[1]);
myStatement.executeUpdate();
}
J'aimerais optimiser cela pour utiliser la syntaxe prise en charge par MySQL:
INSERT INTO table (col1, col2) VALUES ('val1', 'val2'), ('val1', 'val2')[, ...]
mais avec un PreparedStatement
je ne connais aucun moyen de le faire car je ne sais pas à l'avance combien d'éléments array
contiendront. Si ce n'est pas possible avec a PreparedStatement
, comment puis-je le faire autrement (et toujours échapper aux valeurs du tableau)?
la source
connection.setAutoCommit(false);
etconnection.commit();
download.oracle.com/javase/tutorial/jdbc/basics/…i == entities.size()
Lorsque le pilote MySQL est utilisé, vous devez définir le paramètre de connexion
rewriteBatchedStatements
sur true( jdbc:mysql://localhost:3306/TestDB?**rewriteBatchedStatements=true**)
.Avec ce paramètre, l'instruction est réécrite en insertion en bloc lorsque la table n'est verrouillée qu'une seule fois et les index ne sont mis à jour qu'une seule fois. C'est donc beaucoup plus rapide.
Sans ce paramètre, le seul avantage est un code source plus propre.
la source
5.1.45
version du connecteur mysql.rewriteBatchedStatements=true
il n'y a pas de gain de performance.Si vous pouvez créer votre instruction SQL de manière dynamique, vous pouvez effectuer la solution de contournement suivante:
la source
Dans le cas où vous avez l'incrémentation automatique dans la table et avez besoin d'y accéder .. vous pouvez utiliser l'approche suivante ... Faites un test avant de l'utiliser car getGeneratedKeys () dans Statement car cela dépend du pilote utilisé. Le code ci-dessous est testé sur Maria DB 10.0.12 et Maria JDBC driver 1.2
Rappelez-vous que l'augmentation de la taille du lot n'améliore les performances que dans une certaine mesure ... pour ma configuration, augmenter la taille du lot au-dessus de 500 dégradait en fait les performances.
la source
@Ali Shakiba votre code a besoin de quelques modifications. Partie d'erreur:
Code mis à jour:
la source
myArray
longueur est supérieure à cette limite, vous rencontrerez une exception. Dans mon cas, j'ai une limite de 1000 lignes qui nécessite une exécution par lots, car je pourrais potentiellement mettre à jour plus de 1000 lignes sur une exécution donnée. Ce type de déclaration devrait théoriquement fonctionner correctement si vous savez que vous insérez moins que le maximum autorisé. Quelque chose à garder à l'esprit.nous pouvons soumettre plusieurs mises à jour ensemble dans JDBC pour soumettre des mises à jour par lots.
nous pouvons utiliser les objets Statement, PreparedStatement et CallableStatement pour la mise à jour bacth avec désactiver l'autocommit
Les fonctions addBatch () et executeBatch () sont disponibles avec tous les objets instruction pour avoir BatchUpdate
ici, la méthode addBatch () ajoute un ensemble d'instructions ou de paramètres au lot courant.
la source