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] Exception session is closed


Sujet :

Hibernate Java

  1. #21
    Membre éclairé
    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
    Par défaut
    Oui mais si un autre thread arrive et demande currentSession alors que le premier est dans le traitement, alors si le tout est mal configuré il aura la même session que le premier, et au moment où le premier thread ferme le session, alors le second l'a dans l'os ....

    Je teste actuellement une solution donnée par alwin dans un autre post (mais j'ai un problème dans un fichier de mapping actuellement donc je ne peut pas vraiment voir. Je donnerais des nouvelles plus tard quand j'aurais avancé.

  2. #22
    Membre émérite

    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
    Par défaut
    En complément de mon Factory, voici la config de mon hibernate :

    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>

  3. #23
    Membre éclairé
    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
    Par défaut
    Je te remercie, tu me l'a deja donné dans un autre post Alwin, je règle mon problème de mapping d'héritage et je revien confirmer ou infirmer le fonctionnement chez moi.
    Mais juste comme cela, à quoi te sert le ThreadLocal session dans ton hibernateUtil, tu n'apel pas tres session directement avec factory.getcurrentSession ?

  4. #24
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 159
    Par défaut
    Je ne sais pas ou t'as eu ton HibernateUtil mais mois j'utilise celui ci-dessous et ça fonctionne bien
    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
    25
    package utils;
     
    import org.hibernate.*;
    import org.hibernate.cfg.*;
     
    public class HibernateUtil {
     
        private static final SessionFactory sessionFactory;
     
        static {
            try {
                // Create the SessionFactory from hibernate.cfg.xml
                sessionFactory = new 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 SessionFactory getSessionFactory() {
            return sessionFactory;
        }
     
    }
    Pour créer la session je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    Pour la fermeture je fais
    Essaie avec ça

  5. #25
    Membre à l'essai
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Mai 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Brésil

    Informations professionnelles :
    Activité : Intégrateur Web

    Informations forums :
    Inscription : Mai 2005
    Messages : 5
    Par défaut
    Citation Envoyé par K-Kaï
    Oui mais si un autre thread arrive et demande currentSession alors que le premier est dans le traitement, alors si le tout est mal configuré il aura la même session que le premier, et au moment où le premier thread ferme le session, alors le second l'a dans l'os ....
    Justement, avec le mapping donné par Alwin, la session retournée par getCurrentSession() est spécifique à la thread courante.

  6. #26
    Membre éclairé
    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
    Par défaut
    La je ne comprend vraiment pas ce qui se passe, j'obtien une exception session is already closed :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    xException in thread "main" org.hibernate.SessionException: Session was already closed
    	at org.hibernate.impl.SessionImpl.close(SessionImpl.java:270)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    	at java.lang.reflect.Method.invoke(Unknown Source)
    	at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:301)
    	at $Proxy0.close(Unknown Source)
    	at persistance.TestPersist.main(TestPersist.java:46)
    Le tout sur un simple petit test :
    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
     
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    		Transaction tx1 = session.beginTransaction();
     
    		User us = new User();
    		us.setNom("Martin");
    		us.setPrenom("Philippe");
     
    		us.setAdresse("18, rue des cerisiers");
    		us.setCp(63000);
    		us.setVille("Clermont Ferrand");
    		us.setTel("0473658941");
    		us.setMailPerso("lekaille@gmail.com");
     
    		auth.setLogin("toto");
    		auth.setPass("tintin");
     
    		session.persist(auth);
     
    		us.setAuthentification(auth);
     
    		session.persist(us);
    		tx1.commit();
    		session.close();
    Avec la classe HibernateUtil de Alwin ainsi que la même ligne dans le fichier de configuration.

    ...

  7. #27
    Membre éclairé
    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
    Par défaut
    Bon alors après test, le problème vient du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HibernateUtil.getSessionFactory.getCurrentSession()
    Avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HibernateUtil.getSessionFactory.openSession()
    Cela marche ...

    Sauf que moi j'ai besoin du getCurrentSession(), voyez vous ce qui peut ne pas aller et ou ?

    Plus précisément, avec le getCurrentSession() tout se passe bien jusqu'à l'appel à session.close() ? Es ce que avec le getCurrentSession et Hibernate configuré pour fonctionner en Thread Safe (façon Alwin) le close() devient inutile ?

  8. #28
    Membre éprouvé
    Inscrit en
    Juillet 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Juillet 2006
    Messages : 74
    Par défaut
    Bon j'avais le même pb et avec ce code pour creer une session, ça marche nickel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	public static Session currentSession() throws HibernateException {
    		Session s = (Session) session.get();
    		if (s != null && ! s.isConnected()) //on check l'etat de la Session precedente
            	s = null;
    		// Ouvre une nouvelle Session, si ce Thread n'en a aucune
    		if (s == null) {
    			s = sessionFactory.openSession();
    			session.set(s);
    		}
    		return s;
    	}
    Pour ce qui est de ta question sur le getCurrentSession, en faisant un tour sur la javadoc, ils disent ceci :
    public Session getCurrentSession()
    throws HibernateException

    Obtains the current session. The definition of what exactly "current" means controlled by the CurrentSessionContext impl configured for use.

    Note that for backwards compatibility, if a CurrentSessionContext is not configured but a JTA TransactionManagerLookup is configured this will default to the JTASessionContext impl.

  9. #29
    Membre éclairé
    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
    Par défaut
    Entre temps j'ai repéré d'ou venait l'exception, la session est fermé au moment du commit (auto close session il me semble) donc voila pourquoi je me faisais jeté à chaque fois que j'essayais de fermer ma session explicitement.

    A titre indicatif, il semblerait qu'il faille procéder ainsi (toujours dans le contexte multithread):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    try {
    Session s = HibernateUtil.getSessionFactory().getCurrentSession();
    //Traitements
    //commit
    }
    catch(HibernateException e){
    //rollback
    }
    finally{
    HibernateUtil.getSessionFactory().getCurrentSession().close();
    }

  10. #30
    Membre confirmé
    Homme Profil pro
    Ingénieur d'études J2EE
    Inscrit en
    Avril 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur d'études J2EE

    Informations forums :
    Inscription : Avril 2009
    Messages : 82
    Par défaut
    Il ne me semble pas que le commit ferme la session, en tous cas, ce n'est pas cela qui génère l'erreur (que j'ai aussi).

    Pour ma part, j'ai analysé mon HibernateUtil, en particulier la méthode currentSession() et je me rends compte qu'il n'ouvre une nouvelle session que si celle-ci est null. Mais je suppose qu'un session peut-être fermée et ne pas être null (à moins que je n'y connais rien ).

    En tous cas, j'ai ajouté un test "!s.isOpen()" et ça fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public static Session currentSession()
    	throws HibernateException {
    		Session s = (Session) session.get();
    		// Ouvre une nouvelle Session, si ce Thread n'en a aucune
    		if (s == null || !s.isOpen()) {
    			s = sessionFactory.openSession();
    			session.set(s);
    		}
    		return s;
    	}
    De cette façon il m'ouvre une session, qu'elle soit null ou fermée.

    J'espère que cela pourra aider quelqu'un

Discussions similaires

  1. org.hibernate.SessionException: Session is closed!
    Par domas_24 dans le forum Persistance des données
    Réponses: 1
    Dernier message: 16/03/2012, 16h50
  2. [Integration] [Spring/Hibernate/JSF] Session is closed!
    Par mr1azl dans le forum Spring
    Réponses: 4
    Dernier message: 15/03/2011, 08h39
  3. Hibernate session is closed
    Par verbose dans le forum Weblogic
    Réponses: 2
    Dernier message: 04/03/2010, 14h53
  4. org.hibernate.SessionException: Session is closed
    Par Le Pharaon dans le forum Hibernate
    Réponses: 7
    Dernier message: 26/07/2007, 17h42
  5. l'exception :"session is closed"
    Par solawe dans le forum Hibernate
    Réponses: 3
    Dernier message: 04/04/2007, 14h18

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