Java: Insérer plusieurs lignes dans MySQL avec PreparedStatement
Je veux insérer plusieurs lignes dans une table MySQL à la fois à l'aide de Java. Le nombre de lignes est dynamique. Dans le passé, j'étais en train de faire...
for (String element : array) {
myStatement.setString(1, element[0]);
myStatement.setString(2, element[1]);
myStatement.executeUpdate();
}
J'aimerais optimiser cette utilisation de la base de données MySQL-syntaxe prise en charge:
INSERT INTO table (col1, col2) VALUES ('val1', 'val2'), ('val1', 'val2')[, ...]
mais avec un PreparedStatement
je ne sais pas de toute façon de le faire car je ne sais pas à l'avance combien d'éléments array
contiendra. Si il n'est pas possible avec un PreparedStatement
, sinon comment puis-je le faire (et encore échapper les valeurs dans le tableau)?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez créer un lot par
PreparedStatement#addBatch()
et de l'exécuter enPreparedStatement#executeBatch()
.Voici un coup d'envoi exemple:
Il est exécuté à chaque 1000 articles parce que certains pilotes JDBC et/ou DBs peut avoir une limitation sur lot de longueur.
Voir aussi:
connection.setAutoCommit(false);
etconnection.commit();
download.oracle.com/javase/tutorial/jdbc/basics/...i == entities.size()
SQL_INSERT
ressembler? Quelque chose comme ceciINSERT INTO MyTable (value1, value2) VALUES (?,?)
?Lorsque le pilote MySQL est utilisé, vous devez définir la connexion param
rewriteBatchedStatements
à vrai( jdbc:mysql://localhost:3306/TestDB?**rewriteBatchedStatements=true**)
.Avec ce param la déclaration est réécrit afin d'insertion en bloc lors de la table est verrouillée qu'une seule fois et les index sont mis à jour qu'une seule fois. Donc, il est beaucoup plus rapide.
Sans ce param seul avantage est plus propre code source.
5.1.45
mysql version de connecteur.rewriteBatchedStatements=true
il n'y a pas de gain de performance.Si vous pouvez créer votre instruction sql de manière dynamique que vous pouvez faire solution de contournement suivante:
Dans le cas où vous avez incrément automatique dans la table et la nécessité d'y accéder.. vous pouvez utiliser l'approche suivante... Faire de test avant de l'utiliser parce que getGeneratedKeys() dans l'Instruction, car il dépend du pilote utilisé. Le code ci-dessous est testé sur Maria DB 10.0.12 et Maria pilote JDBC 1.2
Rappelez-vous que l'augmentation de la taille des lots améliore les performances uniquement dans une certaine mesure... pour ma configuration, l'augmentation de la taille des lots ci-dessus 500 a été fait à la dégradation de la performance.
@Ali Shakiba votre code a besoin de quelques modifications. Erreur de la partie:
Code mis à jour:
myArray
a une plus grande longueur de cette limite, vous serez frappé une exception. Dans mon cas, j'ai une de 1 000 limite de ligne qui provoque la nécessité d'une exécution du lot, parce que je pourrais potentiellement être mise à jour plus de 1 000 lignes sur tout exécuter. Ce type de déclaration devrait théoriquement fonctionner correctement si vous savez que vous êtes l'insertion de moins que le maximum autorisé. Quelque chose à garder à l'esprit.nous pouvons être soumis à de multiples mises à jour de l'ensemble de JDBC pour soumettre des mises à jour par lot.
nous pouvons utiliser l'Instruction, PreparedStatement, et CallableStatement objets pour bacth mise à jour avec désactiver la validation automatique
addBatch() et executeBatch() fonctions sont disponibles avec tous les objets ont BatchUpdate
ici addBatch() la méthode ajoute un ensemble de déclarations ou les paramètres pour le lot en cours.