Monitoring de l’activité Hibernate, pistes d’optimisation

Cet article présente comment rendre plus transparente l’activité d’Hibernate afin de détecter un éventuel défaut de comportement de son application.
La persistance transparente est une fonctionnalité puissante mais qui mérite d’être surveillée. Combien d’objets, et de quel type, ont été chargés par l’application ? Quel objet a été modifié ? Quelle est la propriété qui a changé ? Quelle était la valeur avant la mise à jour et quelle est la nouvelle valeur ? Combien de requêtes SQL et quel temps d’exécution ?
Autant de questions auxquelles tente de répondre ZenTracker un outil de monitoring.

ZenTracker

Cet outil s’insère dans la mécanique d’Hibernate via les API Interceptor et Listener. Il est disponible sur GoogleCode en téléchargement Utiliser cet outil consiste à passer à la Session Hibernate un Interceptor qui va se charger de collecter des informations sur l’activité. Information qui sera journalisée au moment de la complétion de la transaction. L’intercepteur étant un objet avec état, il en faut une nouvelle instance pour chaque nouvelle Session Hibernate.
Cet outil ne fonctionne qu’à partir de la version 3.2.0 d’Hibernate.

  1. // Opening Session with a fresh instance of the Interceptor
  2. SessionStatisticsInterceptor interceptor = new SessionStatisticsInterceptor();
  3. Session session = sessionFactory.openSession(interceptor);

Dans le cas ou la Session est utilisée sans démarrer de transaction, il faut récupérer l’intercepteur au moment de la fermeture de la Session et déclencher la journalistation manuellement par la méthode logSummary().

Configuration

1. Ajouter le jar zentracker.jar au classpath
2. Déclarer deux propriétés :

 hibernate.jdbc.factory_class=com.zenika.zentracker.hibernate.jdbc.ZenTrackerBatchingFactory <listener type=”flush-entity” class=”com.zenika.zentracker.hibernate.listener.EntityCheckDirtyListener”/>

La propriété factory_class peut être déclarée soit dans le fichier hibernate.properties, soit dans le fichier hibernate.cfg.xml. Le listener doit être déclarée dans le fichier hibernate.cfg.xml.
3. Modifier le fichier log4j.properties :

 # Loggers used by the ZenTracker tool log4j.logger.com.zenika.ZenTracker=debug

4. Déclarer l’intercepteur au moment de la création d’une nouvelle Session. L’intercepteur possède un état, il en faut un pour chaque nouvelle instance de Session.

Utilisation

Comment tracer la modification d’une entité ?

Le listener EntityCheckDirtyListener va se déclencher après celui d’Hibernate après que celui-ci ai déterminé la liste des propriétés « dirty« . Toutes les propriétés modifiées sont ainsi tracées. La trace sera de la forme suivante :

     ZenTracker - Entity [City [NewCityName]] with ID [9] has the following dirty property [name] Previous value was [London], current value is [NewCityName]

Que veut dire surveiller l’activité des entités par type ?

Quand une entité est chargée, mise à jour, supprimée, créée elle sera tracée par l’intercepteur. A la complétion de la transaction il sera possible de savoir combien une entité d’un type donnée a été chargée.

 ZenTracker - Entity <class com.zenika.sample.model.Continent> loaded 2 times ZenTracker - Entity <class com.zenika.sample.model.City> loaded 70 times ZenTracker - Entity <class com.zenika.sample.model.Country> loaded 10 times

Et les collections ?

Il sera possible de connaître l’activité au niveau d’une collection. Dans la trace ci dessous, on peut voir par exemple que la collection countries du Continent Asie a été modifiée au premier flush avec un retrait de deux pays, et qu’au troisième flush un nouveau pays a été ajouté.

 ZenTracker - COLLECTION [3 - com.zenika.sample.model.Continent.countries] for Entity Continent [Asie] has been modified ! ZenTracker - During flush <1> REMOVED : <Country [Russie]> <Country [Japon]> ZenTracker - During flush <3> ADDED : <Country [Zenika]>

Et en ce qui concerne le temps d’exécution des requêtes ?

Sans ajout d’un outil tierce, il est possible d’accéder à toutes les requêtes SQL, savoir combien de fois elles ont été exécutées ainsi que les temps d’exécution (min, max, moyenne)

 ZenTracker - Query <select cities0_.COUNTRY_ID as COUNTRY3_1_, cities0_.id as id1_, cities0_.id as id2_0_, cities0_.name as name2_0_, cities0_.COUNTRY_ID as COUNTRY3_2_0_ from CITY cities0_ where cities0_.COUNTRY_ID=?> executed: 10 times. average: 1 min: 0 max: 7

Carl Azoury

CEO, Zenika

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

%d blogueurs aiment cette page :