L'optimisation n'est pas d'un grand intérêt sans le suivi et l'accès aux données de performance. Hibernate fournit toute une
panoplie de rapport sur ses opérations internes. Les statistiques dans Hibernate sont fournies par SessionFactory
.
Vous pouvez accéder au métriques d'une SessionFactory
de deux manières. La première option est d'appeler sessionFactory.getStatistics()
et de lire ou d'afficher les Statistics
vous même.
Hibernate peut également utiliser JMX pour publier les métriques si vous activez le MBean StatisticsService
. Vous pouvez activer un seul MBean pour toutes vos SessionFactory
ou un par factory. Voici un code qui montre un exemple de configuration minimaliste :
// MBean service registration for a specific SessionFactory Hashtable tb = new Hashtable(); tb.put("type", "statistics"); tb.put("sessionFactory", "myFinancialApp"); ObjectName on = new ObjectName("hibernate", tb); // MBean object name StatisticsService stats = new StatisticsService(); // MBean implementation stats.setSessionFactory(sessionFactory); // Bind the stats to a SessionFactory server.registerMBean(stats, on); // Register the Mbean on the server
// MBean service registration for all SessionFactory's Hashtable tb = new Hashtable(); tb.put("type", "statistics"); tb.put("sessionFactory", "all"); ObjectName on = new ObjectName("hibernate", tb); // MBean object name StatisticsService stats = new StatisticsService(); // MBean implementation server.registerMBean(stats, on); // Register the MBean on the server
TODO: Cela n'a pas de sens : dans le premier cs on récupère et on utilise le MBean directement. Dans le second, on doit fournir
le nom JNDI sous lequel est retenu la fabrique de session avant de l'utiliser. Pour cela il faut utiliser hibernateStatsBean.setSessionFactoryJNDIName("my/JNDI/Name")
Vous pouvez (dés)activer le suivi pour une SessionFactory
au moment de la configuration en mettant hibernate.generate_statistics
à false
à chaud avec sf.getStatistics().setStatisticsEnabled(true)
ou hibernateStatsBean.setStatisticsEnabled(true)
Statistics can be reset programmatically using the clear()
method. A summary can be sent to a logger (info level) using the logSummary()
method.
Hibernate fournit un certain nombre de métriques, qui vont des informations très basiques aux informations très spécialisées
qui ne sont appropriées que dans certains scenarii. Tous les compteurs accessibles sont décrits dans l'API de l'interface
Statistics
dans trois catégories :
Les métriques relatives à l'usage général de la Session
comme le nombre de sessions ouvertes, le nombre de connexions JDBC récupérées, etc...
Les métriques relatives aux entités, collections, requêtes et caches dans leur ensemble (métriques globales),
Les métriques détaillées relatives à une entité, une collection, une requête ou une région de cache particulière.
For example, you can check the cache hit, miss, and put ratio of entities, collections and queries, and the average time a query needs. Beware that the number of milliseconds is subject to approximation in Java. Hibernate is tied to the JVM precision, on some platforms this might even only be accurate to 10 seconds.
Des accesseurs simples sont utilisés pour accéder aux métriques globales (e.g. celles qui ne sont pas liées à une entité,
collection ou région de cache particulière). Vous pouvez accéder aux métriques d'une entité, collection, région de cache particulière
à l'aide de son nom et à l'aide de sa représentation HQL ou SQL pour une requête. Référez vous à la javadoc des APIS Statistics
, EntityStatistics
, CollectionStatistics
, SecondLevelCacheStatistics
, and QueryStatistics
pour plus d'informations. Le code ci-dessous montre un exemple simple :
Statistics stats = HibernateUtil.sessionFactory.getStatistics(); double queryCacheHitCount = stats.getQueryCacheHitCount(); double queryCacheMissCount = stats.getQueryCacheMissCount(); double queryCacheHitRatio = queryCacheHitCount / (queryCacheHitCount + queryCacheMissCount); log.info("Query Hit ratio:" + queryCacheHitRatio); EntityStatistics entityStats = stats.getEntityStatistics( Cat.class.getName() ); long changes = entityStats.getInsertCount() + entityStats.getUpdateCount() + entityStats.getDeleteCount(); log.info(Cat.class.getName() + " changed " + changes + "times" );
Pour travailler sur toutes les entités, collections, requêtes et régions de cache, vous pouvez récupérer la liste des noms
des entités, collections, requêtes et régions de cache avec les méthodes : getQueries()
, getEntityNames()
, getCollectionRoleNames()
, et getSecondLevelCacheRegionNames()
.