Bonjour tout le monde,
Je suis actuellement entrain de réaliser la partie traitement de données d'une application web. Pour cela, j'ai décidé d'utiliser le duo Hibernate et PostGres. J'ai réaliser tout le traitement de donnée en utilisant les méthodes save, update et les criterions qui semblaient adaptés dans le cadre de requêtes simples. J'ai testé les performances de mes traitements à l'aide de tests unitaires en localhost (plus de 1000 fois chaque requête pour connaitre le temps de réponse moyen, sans vider le cache). Certaines requêtes mettent presque 1 seconde à l'exécution. J'ai chercher sur le net, j'ai remarqué que l'utilisation des deux caches de Hibernates (requête et secondaire) et la bonne gestion des sessions pouvaient aider à diminuer le temps d'exécution des requêtes récurrentes. Le seul problème, c'est que je n'arrive pas à trouver de tutorial clair expliquant l'utilisation de tout ça.
Dés lors, j'aimerais des conseils sur les domaines suivants:
- la gestion des session afin d'avoir une gestion des données multi-threader optimale
- la gestion du cache de premier niveau de hibernate
- la gestion du cache de second niveau de hibernate
- les best practices sur Hibernate
Voici les différentes sources qui vous permettrons de comprendre un peu comment tout cela marche
Le fichier de config de hibernate :
Code :
- <?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE hibernate-configuration
- PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
- "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
- <hibernate-configuration>
- <session-factory >
- <!-- local connection properties -->
- <property name="hibernate.connection.url">jdbc:postgresql://localhost/Report</property>
- <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
- <property name="hibernate.connection.username">mathieu</property>
- <property name="hibernate.connection.password">mathieu</property>
- <!-- property name="hibernate.connection.pool_size"></property -->
- <!-- EhCache -->
- <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
- <property name="hibernate.cache.use_query_cache">true</property>
- <property name="hibernate.cache.use_second_level_cache">true</property>
- <property name="hibernate.cache.use_structured_cache">true</property>
- <!-- dialect for PostgreSQL -->
- <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
- <property name="hibernate.show_sql">false</property>
- <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
- <!-- mapping for Table -->
- <mapping resource="com/modele/donnees/Message.hbm.xml"/>
- </session-factory>
- </hibernate-configuration>
|
le fichier de mapping de Message :
Code :
- <?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
- <hibernate-mapping package="com.modele.donnees">
- <class
- name="Message"
- table="message"
- >
- <meta attribute="sync-DAO">false</meta>
- <id
- name="Id"
- type="integer"
- column="message_id"
- >
- <generator class="sequence"/>
- </id>
- <property
- name="TypeMessage"
- column="type_message"
- type="string"
- not-null="false"
- length="15"
- />
- <property
- name="Dateecriture"
- column="dateecriture"
- type="date"
- not-null="false"
- length="13"
- />
- <property
- name="Masquer"
- column="masquer"
- type="boolean"
- not-null="false"
- length="1"
- />
- <property
- name="ContenuMessage"
- column="contenu_message"
- type="string"
- not-null="false"
- />
- <many-to-one
- name="Membre"
- column="membre_id"
- class="Membre"
- not-null="true"
- >
- </many-to-one>
- <set name="LienMembreCompteRendus" inverse="true">
- <key column="message_id"/>
- <one-to-many class="LienMembreCompteRendu"/>
- </set>
- </class>
- </hibernate-mapping>
|
la classe de gestion des sessions : (j'avouais que je l'ai rouver sur le net et que je l'ai pas encore vraiment retravailler)
Code :
- package com.dao.connexion;
- import org.hibernate.HibernateException;
- import org.hibernate.SessionFactory;
- import org.hibernate.cfg.Configuration;
- import org.hibernate.classic.Session;
- public class connexion
- {
- private static final SessionFactory sessionFactory;
- static
- {
- try
- {
- sessionFactory = new Configuration().configure().buildSessionFactory();
- }
- catch (HibernateException ex)
- {
- throw new RuntimeException("Exception building SessionFactory: "+ ex.getMessage(), ex);
- }
- }
- public static final ThreadLocal session = new ThreadLocal();
- public static Session currentSession() throws HibernateException
- {
- Session s = (Session) session.get();
- // Open a new Session, if this Thread has none yet
- if (s == null)
- {
- s = sessionFactory.openSession();
- session.set(s);
- }
- return s;
- }
- public static void closeSession() throws HibernateException
- {
- Session s = (Session) session.get();
- session.set(null);
- if (s != null)
- s.close();
- }
- }
|
le code permettant de creer un message :
Code :
- Session session = connexion.currentSession();
- Transaction transaction = session.beginTransaction();
- session.save(nouveauMessage);
- for (Iterator<LienMembreCompteRendu> iterator = lien.iterator(); iterator.hasNext();)
- session.save((LienMembreCompteRendu) iterator.next());
- transaction.commit();
- connexion.closeSession();
|
(Je crois que c'est pas terrible ce que je fais la, le close connexion )
et le fichier de recherche de message :
Code :
- Session session = connexion.currentSession();
- if (identifiant != "" )
- {
- try
- {
- listMessage.add((Message)session.createCriteria(Message.class)
- .add( Restrictions.eq("Id",Integer.parseInt(identifiant))).uniqueResult());
- }
- catch(ClassCastException ex){new RapportErreur(ex,classe);}
- }
- else
- listMessage = session.createCriteria(Message.class)
- .list();
|
Voila. Pouvez vous me donner vos commentaires et me donner des petits conseils? Merci
---------------
En informatique, il n'y a pa de solution, que des problèmes :)