IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Hibernate Java Discussion :

EntityManager Annotation performance


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 16
    Par défaut EntityManager Annotation performance
    Et oui, c'est encore moi, un problème résolu et en voici déjà un autre qui pointe le bout de son nez

    Voilà, j'utilise Hibernate dans une application web avec Servlet et jsp . Pour Hibernate j'utilise l'EntityManager, les Annotations et le fichier persistence.xml.

    J'ai l'impression d'avoir des problèmes de performance.
    J'ai lu sur pas mal de site qu'il fallait gérer les problèmes de Thread, mais sans trouver quelquechose de précis sur la manière de faire.

    Pour le moment j'ai une classe EntityManagerUtil qui gère la création et la fermeture de l'entityManager. Mais j'ai pas bien compris comment l'utiliser au niveau de ma servlet (j'en ai meme plusieurs).

    Si vous avez une idée de comment on fait, ou bien des sites où c'est expliqué, je suis preneuse.

    Merci beaucoup.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 383
    Par défaut
    Pour améliorer les performances de l'utilisation d'Hibernate, il faut surtout maîtriser la manière dont tu récupères tes objets en fonction de ce que tu vas en faire : est-ce qu'il vaut mieux utiliser le lazy loading ? faire des sous-requêtes ? au contraire remonter tous les objets ?
    L'utilisation du cache peut aussi être utile, pour les données qui changent rarement.
    Il y a des explications ici :
    http://www.hibernate.org/hib_docs/re...rformance.html

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 16
    Par défaut En fait
    Quand je parlais de performance, je faisais allusion à ce qui est décrit dans ce site
    http://jl2tho.blogspot.com/2007/08/t...ityManagerUtil

    Il utilise leur propre classe "WebContainerServlet" pour leur Servlet.
    Et je ne souhaite pas l'utiliser.

    Est ce que ce que décrit ce site est pertinent, ou bien vaut il mieux que je créé pour chaque classe ou je fais mes traitements un EntityManagerFactory, EntityManager et une Transaction.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 100
    Par défaut
    L'objectif de cette classe c'est que l'objet EntityManager (ou l'objet Session, c'est comme tu veux...) ne soit pas créé à chaque fois qu'on en a besoin. Ce qui nuirait à la performance.

    Ici l'objet est créé la première fois qu'on en a besoin. Et il n'est pas détruit.
    Moi j'utilise la classe suivante :

    HibernateUtil.java

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    import org.hibernate.*;
    import org.hibernate.cfg.*;
     
    public class HibernateUtil {
     
    	private static final SessionFactory sessionFactory;
     
        static {
            try {
                sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
            } catch (Throwable ex) {
                throw new ExceptionInInitializerError(ex);
            }
        }
     
        public static Session getSession()
                throws HibernateException {
            return sessionFactory.openSession();
        }
    }
    Et j'y fais appel de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Session session = HibernateUtil.getSession();
    Est-ce que cela répond à ta question ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 16
    Par défaut
    D'accord donc je garde ma classe EntityManagerUtil
    qui est comme ça. Est ce que ça te semble bon?
    package abaque.traitement;

    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.Persistence;

    import org.apache.log4j.Logger;

    public class EntityManagerUtil {

    private static final Logger log = Logger
    .getLogger(SiteServlet.class);

    private static EntityManagerFactory emf;
    public static final ThreadLocal<EntityManager> entitymanager = new ThreadLocal<EntityManager>();

    public static EntityManagerFactory getEntityManagerFactory(){
    if (emf == null){
    log.info("EntityManagerUtil.getEntityManagerFactory : nouveau EntityManagerFactory");

    // Create the EntityManagerFactory
    // Attention : il s'agit du nom de la PersistenceUnit du fichier persistence.xml qui doit etre utilise
    emf = Persistence.createEntityManagerFactory(Constantes.PERSISTENCE_NAME);
    }
    return emf;
    }

    public static EntityManager getEntityManager(){
    EntityManager em = entitymanager.get();

    //Create a new EntityManager
    if (em == null){
    em = emf.createEntityManager();
    entitymanager.set(em);
    }
    return em;
    }

    /**

    * Ferme l'entityManager afin d'assurer l'isolation.

    */

    public static void closeEntityManager() {
    EntityManager em = entitymanager.get();
    entitymanager.set(null);

    if (em != null) em.close();

    }
    }
    J'ai une dernière question
    As tu rajouté du code au niveau de ta Servlet? (Sachant qu'en plus moi j'utilise plusieurs Servlet)
    Moi par exemple j'ai surchargé les classes init() et destroy()

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 100
    Par défaut
    La classe m'a l'air bien.

    Sauf que je ne voie bien l'intérêt de la méthode :closeEntityManager()
    Puisque l'objectif c'est de garder l'EntityManager ouvert et ne pas avoir à le recréer avant chaque requête...

    Quand tu as besoin de l'entityManager :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    EntityManager entityManager = EntityManagerUtil.getEntityManager ();
    Je ne comprend pas ce que tu veux dire par rapport aux méthodes init et destroy. Peux-tu montrer un exemple ?

Discussions similaires

  1. [maintenance][performance] Que faire comme maintenance ?
    Par woodwai dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 06/11/2003, 15h39
  2. Performance xml
    Par MicKCanE dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 07/07/2003, 06h41
  3. [ POSTGRESQL ] Problème de performance
    Par Djouls64 dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 26/05/2003, 16h18
  4. [JDBC][connexion persistante] performances avec JDBC
    Par nawac dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 06/05/2003, 10h37
  5. performance entre 3DS, ase, asc ...
    Par amaury pouly dans le forum OpenGL
    Réponses: 3
    Dernier message: 24/03/2003, 11h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo