mercredi 13 juin 2007

Batch avec Hibernate ...

Voici une problématique à laquelle j'ai été récemment confronté. Mon problème était de faire un batch java
  • pour importer des données dans une base de reporting
  • pour consolider ces données pour préparer les rapports
Dans un premier temps, avec les mots clés Java et Base de données, je me suis naturellement tourné vers MySql (de base sur mon Ubuntu) et Hibernate.

Je fais ma petite recherche sur Internet et trouve plusieurs moyens de réaliser des batchs. Voici les pointeurs que j'ai retenu :
Au final, j'ai opté pour une solution simple, l'utilisation de l'objet ScrollableResults pour lire mes quelques 100000 lignes et l'ajout de l'option batch-size=30 dans mon fichier de mapping pour limiter le nombre de requêtes insert (hibernate faisant des insert par paquets de 30).

Au final, voici un bout de code réutilisable pour l'utilisation de l'objet
ScrollableResults :
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();

Query query = session.createQuery("from TableData t where ...");

ScrollableResults results = query.scroll();

while (results.next()){
// Récupération des données et exploitation
TableData tableData = TableData (results.get()[0]);
...
// Ajout de données consolidées
// => requêtes insert par paquet par Hibernate
...
session.saveOrUpdate(element);
...

}
results.close();

tx.commit();
session.close();

Si vous avez d'autres suggestions, n'hésitez pas à laisser un commentaire ...

Aucun commentaire: