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 :

[Hibernate] Session Factory ThreadSafe


Sujet :

Hibernate Java

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    370
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 370
    Points : 223
    Points
    223
    Par défaut [Hibernate] Session Factory ThreadSafe
    Voila, j'ai besoin dans mon application tournant sous Tomcat de garantir que toute mes sessions seront threadSafe (Ie chaque transaction doit avoir lieu dans sa propre session independante des autres transactions, car chaque requète à mon appli seera gérer dans un thread par Tomcat.

    D'après la doc Hibernate, on obtien des session en ayant construit une SessionFactory et en appelant la methode getCurrentSession de celle ci.

    Or pour utiliser cette methode de manière Thread Safe, il faut configurer convenablement la SessionFactory :

    Soit avec un JTA (malgrès la doc lue je ne comprend pas trop ce que c'est, comment en obtenir un avec Tomcat ...)

    Soit avec un ThreadLocalSessionContext

    Quel solution prévilègeriez vous dans mon cas et avez vous des exemple de ce qu'il faut faire pour mettre en place ceci ?
    Comment obtenir un JTA, comment definir une classe implementant ThreadLocalSessionContext ?
    La posix attitude ...

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    370
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 370
    Points : 223
    Points
    223
    Par défaut
    Je mets un petit up, personne ne vois comment cela fonctionne ?

    J'ai egalement regarder les sources de caveatemptor, ou il y a l'utilisation d'un ThreadLocalSessionContext mais je comprend pas bien ce dont j'ai besoin (il indique notamment qu'il se sert de sa classe pour des sessions longues or pour le moment je travail avec des sessions courtes.
    La posix attitude ...

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Points : 1 151
    Points
    1 151
    Par défaut
    Voici ce que j'utilise de mon coté

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <!-- Enable Hibernate's automatic session context management -->
    <property name="current_session_context_class">thread</property>
    et mon HibernateUtil :
    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
    22
    23
    24
    package com.vvic.basetest.hibernate.util;
     
    import org.hibernate.SessionFactory;
     
    public class HibernateUtil {
        public static final SessionFactory sessionFactory;
     
        static {
            try {
                // Création de la SessionFactory à partir de hibernate.cfg.xml
                sessionFactory = new org.hibernate.cfg.Configuration().configure().buildSessionFactory();
            } catch (Throwable ex) {
                // Make sure you log the exception, as it might be swallowed
                System.err.println("Initial SessionFactory creation failed." + ex);
                throw new ExceptionInInitializerError(ex);
            }
        }
     
        public static final ThreadLocal session = new ThreadLocal();
     
        public static SessionFactory getSessionFactory() {
            return sessionFactory;
        }
    }
    Clic me...
    CV en ligne

    Il y a 10 types de personnes, celui qui connait le binaire, et l'autre...

    Pas de réponse en MP...Merci

  4. #4
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut
    Citation Envoyé par Alwin
    Voici ce que j'utilise de mon coté

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <!-- Enable Hibernate's automatic session context management -->
    <property name="current_session_context_class">thread</property>
    et mon HibernateUtil :
    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
    22
    23
    24
    package com.vvic.basetest.hibernate.util;
     
    import org.hibernate.SessionFactory;
     
    public class HibernateUtil {
        public static final SessionFactory sessionFactory;
     
        static {
            try {
                // Création de la SessionFactory à partir de hibernate.cfg.xml
                sessionFactory = new org.hibernate.cfg.Configuration().configure().buildSessionFactory();
            } catch (Throwable ex) {
                // Make sure you log the exception, as it might be swallowed
                System.err.println("Initial SessionFactory creation failed." + ex);
                throw new ExceptionInInitializerError(ex);
            }
        }
     
        public static final ThreadLocal session = new ThreadLocal();
     
        public static SessionFactory getSessionFactory() {
            return sessionFactory;
        }
    }
    Hello,

    Je suis quasiment novice niveau hibernate...

    Est ce que tu pourrais commenter ton code pour mieux comprendre ce qu'il réalise?
    Je ne comprend pas le lien entre la déclaration xml et le code en-dessous.
    La déclaration XML indique que l'application tourne dans un environnement multi-threader?

    Est ce qu'il ne faut pas que tu stocke ton sessionFactory dans ton ThreadLocal? car dans l'état actuel des choses tu utilises toujours le meme même objet sessionFactory?

    Merci d'avance pour tes explications
    @+

    Fabszn
    Twitter : @fsznajderman

    N'oubliez pas le bouton
    Comment bien poser ses questions sur le forum


  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Points : 1 151
    Points
    1 151
    Par défaut
    E fait, dans ce code, le ThreadLocal ne sert plus à rien.
    Hibernate support seul la notion de currentSession

    A toi de la configurer dans ton fichier de configuration général avec la balise XML que j'ai donné.

    Pour la classe, elle se charge juste d'initialiser la configuration au chagement dans le classloader (initialiseur static)
    Clic me...
    CV en ligne

    Il y a 10 types de personnes, celui qui connait le binaire, et l'autre...

    Pas de réponse en MP...Merci

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Salut, je suis en train de suivre la doc qui est fourni par hibernate. Mais lorsque je fais appel à la méthode HibernateUtil.getSessionFactory().getCurrentSession(); on me dit que getCurrentSession() n'est pas défini pour le type getSessionFactory? Savez vous pourquoi j'ai ce message? Merci

  7. #7
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut
    Citation Envoyé par Alwin
    E fait, dans ce code, le ThreadLocal ne sert plus à rien.
    Hibernate support seul la notion de currentSession

    A toi de la configurer dans ton fichier de configuration général avec la balise XML que j'ai donné.

    Pour la classe, elle se charge juste d'initialiser la configuration au chagement dans le classloader (initialiseur static)
    Hello,

    Merci pour ta réponse!
    Donc si j'ai bien compris , avec la déclaration xml et le code en dessous (sans la déclaration du ThreadLocal) je peux utiliser l'objet session dans un environnement multiThreader?
    C'est hibernate qui gère cela tout seul...

    Merci d'avance,
    @+

    Fabszn
    Twitter : @fsznajderman

    N'oubliez pas le bouton
    Comment bien poser ses questions sur le forum


Discussions similaires

  1. Réponses: 5
    Dernier message: 26/10/2010, 17h44
  2. Hibernate.cfg et multiple <session-factory>
    Par JamesP dans le forum Hibernate
    Réponses: 3
    Dernier message: 13/10/2010, 11h34
  3. [tomcat 5.5,hibernate 3.2] bind entre la session factory et jndi
    Par sallemel dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 19/08/2010, 21h43
  4. [HIBERNATE] Error getting Hibernate Session Factory
    Par so7lob dans le forum Hibernate
    Réponses: 1
    Dernier message: 16/12/2008, 14h29
  5. hibernate et session factory
    Par sandytarit dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 17/01/2007, 13h10

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