Manière efficace de faire des lots INSÈRE avec JDBC
Dans mon application, j'ai besoin de faire beaucoup de plaquettes. Ses une application Java et je suis en utilisant la plaine de JDBC pour exécuter les requêtes. La DB être Oracle. J'ai activé le traitement par lots, donc il me permet de gagner les latences réseau pour exécuter des requêtes. Mais les requêtes exécuter en série en tant que distincts des Insertions:
insert into some_table (col1, col2) values (val1, val2)
insert into some_table (col1, col2) values (val3, val4)
insert into some_table (col1, col2) values (val5, val6)
Je me demandais si la forme suivante de l'INSERT peut être plus efficace:
insert into some_table (col1, col2) values (val1, val2), (val3, val4), (val5, val6)
c'est à dire l'effondrement de plusieurs Insère dans un.
Tout autres conseils pour faire de lot Insère plus vite?
- WOW! J'ai testé votre "effondrement de plusieurs insère dans un" lors de l'insertion de SQL Server, et je suis passé de 107 lignes/seconde à 3333 lignes par seconde!
- C'est un superbe 31x augmentation.
Vous devez vous connecter pour publier un commentaire.
C'est un mélange des deux réponses précédentes:
ps.clearParameters();
est inutile dans ce cas particulier.Si la question demande insérer efficacement à Oracle à l'aide de JDBC, je suis en train de jouer avec DB2 (IBM mainframe), sur le plan conceptuel de l'insertion serait similaire donc pensé qu'il pourrait être utile de voir mes statistiques entre
l'insertion d'un enregistrement à la fois
l'insertion d'un lot d'enregistrements (très efficace)
Voici les mesures
1) l'Insertion d'un enregistrement à la fois
Les métriques pour les 100 transactions :
La première opération est autour de
120-150ms
qui est pour la requête analyser et puis l'exécution, les transactions suivantes ne sont à prendre autour de50ms
. (Ce qui est encore élevé, mais ma base de données est sur un serveur différent(j'en ai besoin pour résoudre les problèmes du réseau))2) Avec l'insertion dans un lot (efficace) - réalisé par
preparedStatement.executeBatch()
Les mesures pour un lot de 100 transactions est
et pour 1000 transactions
Donc faire de 100 transactions dans
~5000ms
(avec un trxn à la fois) est diminué de~150ms
(avec un lot de 100 enregistrements).NOTE - Ignorer mon réseau qui est super lent, mais les mesures de valeurs relatives.
La
Statement
vous donne l'option suivante:Vous aurez pour indice de référence, évidemment, mais plus de JDBC émission de plusieurs insertions sera beaucoup plus rapide si vous utilisez un PreparedStatement plutôt qu'un Énoncé.
Vous pouvez utiliser cette
rewriteBatchedStatements
paramètre pour que l'insertion soit encore plus rapide.vous pouvez lire ici sur le param: MySQL et de JDBC avec rewriteBatchedStatements=true
Comment sur l'utilisation de l'INSÉRER déclaration ?
Je me souviens que la dernière instruction select est obligatoire afin de faire cette demande à réussir. Ne me souviens pas mais pourquoi.
Vous pourriez envisager d'utiliser PreparedStatement plutôt bien. de nombreux avantages !
Farid
Vous pouvez utiliser addBatch et executeBatch pour le lot insérer dans java Voir l'Exemple : Lot Insérer Dans Java
Dans mon code je n'ai pas d'accès direct à la 'preparedStatement' donc je ne peux pas utiliser le traitement par lots, je viens de passer la requête et une liste de paramètres. Le truc, cependant, est de créer une variable longueur de l'insert et une LinkedList de paramètres. L'effet est le même comme le premier exemple, avec la variable d'entrée de paramètre longueur.Voir ci-dessous (vérification des erreurs omis).
En supposant que 'myTable' a 3 champs modifiables: f1, f2 et f3
dans mon DBInterface classe j'ai:
À l'aide de PreparedStatements sera BEAUCOUP plus lente que les Déclarations si vous avez des itérations. Pour acquérir un avantage de performance de l'aide d'un PrepareStatement sur une déclaration, vous devez l'utiliser dans une boucle où les itérations sont à moins de 50 ou plus.
Lot insérer à l'aide de déclaration