L’une des fonctionnalités la moins connue de JDBC est sa capacité à exécuter des opérations SQL par Lot en combinat les méthodes addBatch et executeBatch de Statement (et les autres variantes de Statement).
Je présente dans cette étude une expérience simple qui montre l’utilité, d’un point de vue temps de réponse globale, de l’exploitation judicieuse de cette fonctionnalité.
Exécution d’opérations par lot
Pour améliorer les performances lors de la réalisation de mises à jour multiples d’une base de données, un grand nombre de pilote JDBC (Oraxcle, PostgrSQL, MS SQL) offre la possibilité de soumettre plusieurs mises à jour comme un seul travail, appelé également lot.
La méthode addBatch permet d’ajouter une commande.
La méthode executeBatch permet de soumettre toutes les commandes pour traitement.
Seules des instructions DDL (Data Definition Language, langage de définition de données) et DML (Data Manipulation Language, langage de manipulation de données) retournent un seul nombre de mises à jour peuvent être exécutées dans un lot.
La méthode executeBatch retourne un tableau de valeurs int correspondant au nombre de mises à jour de chaque commande.
JSBC et Exécution d’opérations par lot
Regroupement de plusieurs mises à jour:
connexion.setAutoCommit(false);
Statement st = connexion.createStatement();
st.addBatch(”INSERT …”); // Ajoute une requête SQL pour executeBatch
st.addBatch(”UPDATE …”); // Ajoute une requête SQL pour executeBatch
int[] nb = st.executeBatch(); // retourne le nombre de Mise à jour effectuées
Méthode « appropriée pour le codage » : exploiter l’abstraction de l’Ioc avec Spring
Je recommande d’utiliser Utiliser la copmbinaison suivante
a) PreparedStatement
b) Spring templates pour les Batch updates
Ainsi, On peut combiner des « Prepared Statement » et des « Batch updates ».

Outils de mesure :
Le plus simple c’est d’utiliser un profilé ou bien l’AOP avec Spring.
Dans cette présentation, j’ai utilisé NetBeans profilé version 6.5.1.
24 mesures ont été effectuées dans les conditions suivantes
Un Laptop avec 2Go De RAM (les mesures n’ont pas de valeurs intrinsèques, c’est la comparaison des résutlats qui m’interesse)
Une base de données PostgrSQL sous Windows
La table est vidée après chaque exécution (avoir les mêmes conditions)
Les paramètres qui ont été variés
Le nombre d’insertion : de 100 à 10000
La valeur batchsize (taille du lots d’opérations SQL à batcher ) : de 1 à 200
Les résultats sont les suivants :

Ramené à l’unité : temps de réponse moyen d’une seule insertion


Si on estime le gain en % de temps de réponse pour une insertion, on remarque l’impact de cette méthode sur le résultat final pour les grands nombre d’insertion (jusqu’à 90% !!).

Observations annexes :
La création d’objets relatifs à l’opération JDBC, java.sql.*, permet de comprendre comment se passe les opérations.
Cas : batch size = 1 et 10000 insert

Cas : batch size = 50 et 10000 insert

Cas : batch size = 200 et 10000 insert

Objets crées par Spring

Confirmation du nombre d’appel à getConnection() : dans ce cas 10 fois moins d’appel à la connexion à la base de données que d’appel à la méthode update (qui contient la requête SQL SQL)

Conclusion
Pour améliorer les performances lors de la réalisation d’un grand nombre de mises à jour d’une base de données, il est fortement recommandé d’exploiter la capacité de JDBC à réaliser des mises à jour par lot.