Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3031 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [hibernate] SessionException...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[hibernate] SessionException...

n°1299876
fixEF
Posté le 06-02-2006 à 15:46:39  profilanswer
 

Bonjour,
 
J'ai un gros souci avec hibernate 3.1.
J'ai très régulierement des SessionException lors d'une tentative d'ajout, d'update ou même de lecture. La cause : une Session prématurément close ?
Je vois pas du tout d'ou peut venir le problème. Que faut-il que je vérifie ? Quels sont les points critiques dans la gestion de session ????
 
Voici mon hibernate.cfg.xml :

Code :
  1. <?xml version='1.0' encoding='utf-8'?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3.         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  5. <hibernate-configuration>
  6.     <!-- une instance de SessionFactory accessible par son nom jndi -->
  7.     <session-factory
  8.         name="java:comp/env/hibernate/SessionFactory">
  9.         <!-- propriétés -->
  10.         <property name="connection.username">user</property>
  11.         <property name="connection.password">pass</property>
  12.         <property name="connection.url">jdbc:postgresql://150.85.225.51:5432/video </property>
  13.    <property name="connection.driver_class">org.postgresql.Driver</property>
  14.         <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
  15.         <property name="batch_size">20</property>
  16.         <property name="show_sql">true</property>
  17.         <property name="use_outer_join">true</property>
  18.         <property name="default_lazy">true</property>
  19.  <property name="c3p0.acquire_increment">1</property>
  20.    <property name="c3p0.idle_test_period">100</property>
  21.    <property name="c3p0.min_size">10</property>
  22.    <property name="c3p0.max_size">100</property>
  23.    <property name="c3p0.timeout">100</property>
  24.    <property name="c3p0.max_statements">0</property>
  25.        
  26.         <!--property name="transaction.factory_class">
  27.             org.hibernate.transaction.JTATransactionFactory
  28.         </property>
  29.         <property name="jta.UserTransaction">java:comp/UserTransaction</property-->
  30.         <!-- mapping files -->
  31. <mapping resource="titi/tutu/toto/Livrable.hbm.xml"/>
  32.     </session-factory>
  33. </hibernate-configuration>


 
et mon code (j'utilise la classe hibernate utilitaire préconisée dans la doc de référence hibernate):  
 

Code :
  1. DemandePrestation dp=null;
  2.         try {
  3.             HibernateUtil.beginTransaction();
  4.             Session session = HibernateUtil.getSession();
  5.             dp = (DemandePrestation)session.get(DemandePrestation.class, dp_id);
  6.             Livrable livrable = new Livrable();
  7.             livrable.setId(livrable_id);
  8.             livrable.setDatePrevue(date);
  9.             livrable.setLibelle(libelle);
  10.             livrable.setCommentaire(commentaire);
  11.             dp.addLivrable(livrable);
  12.             session.save(livrable);
  13.             HibernateUtil.commitTransaction();
  14.         } catch (SessionException e) {
  15.             log.error(e);
  16.             HibernateUtil.rollbackTransaction();
  17.             throw new HibernateException("Erreur : Session invalide. Veuillez vous reconnecter" );
  18.         } catch (ConstraintViolationException e) {
  19.             log.error(e);
  20.             HibernateUtil.rollbackTransaction();           
  21.             throw new HibernateException("Erreur : Livrable déja existant" );           
  22.         } catch (Exception e) {
  23.             log.error(e);
  24.             HibernateUtil.rollbackTransaction();
  25.             throw new HibernateException("Erreur inattendue" );
  26.         }finally {
  27.             HibernateUtil.closeSession();
  28.         }


 
Merci !!

mood
Publicité
Posté le 06-02-2006 à 15:46:39  profilanswer
 

n°1300098
the real m​oins moins
Posté le 06-02-2006 à 20:27:26  profilanswer
 

et la tronche de l'exception ?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°1300521
fixEF
Posté le 07-02-2006 à 15:06:24  profilanswer
 

J'ai pas réussi à reproduire le cas ce matin.
C'est une SessionException : Session is closed
Alors que je la récupère via ma classe utilitaire HibernateUtil :

Code :
  1. public class HibernateUtil {
  2.      //private static final Logger log = Logger.getLogger("com.laposte.dirr.dri.pilotage.hibernate.HibernateUtil" );
  3.    
  4.         private static final SessionFactory sessionFactory;
  5.         private static Configuration configuration;
  6.         private static final ThreadLocal threadSession = new ThreadLocal();
  7.         private static final ThreadLocal threadTransaction = new ThreadLocal();
  8.         private static final ThreadLocal threadInterceptor = new ThreadLocal();
  9.        
  10.         static {
  11.             try {
  12.                 configuration = new Configuration();
  13.                 // Crée la SessionFactory
  14.                 sessionFactory = configuration.configure().buildSessionFactory();
  15.             } catch (Throwable e) {
  16.                 //log.error(e);
  17.                 throw new RuntimeException(e);
  18.             }
  19.         }
  20.        
  21.         public static Configuration getConfiguration() {
  22.             return configuration;
  23.         }
  24.        
  25.        
  26.         public static SessionFactory getSessionFactory() {
  27.             /* via JNDI  
  28.             SessionFactory sessions=null;
  29.             try{
  30.                 Context ctx = new InitialContext();
  31.                 String jndiName = "java.hibernateFactory";
  32.                 sessions = (SessionFactory)ctx.lookup(jndiName);
  33.             }catch (NamingException e) {
  34.                 throw new HibernateException(e);
  35.             }
  36.             return sessions;
  37.             */
  38.             return sessionFactory;
  39.         }
  40.        
  41.        
  42.         public static Session getSession() throws HibernateException {
  43.             Session s = (Session) threadSession.get();
  44.             // Ouvre une nouvelle Session, si ce Thread n'en a aucune
  45.             try {               
  46.                 if (s == null) {
  47.                     /*
  48.                     if (getInterceptor() !=null) {
  49.                         s= getSessionFactory().openSession(getInterceptor());
  50.                     } else*/
  51.                     s = sessionFactory.openSession();
  52.                    
  53.                     threadSession.set(s);
  54.                 }
  55.             }catch (HibernateException e) {
  56.                 throw e;
  57.              }
  58.            
  59.             return s;
  60.         }
  61.        
  62.         public static void closeSession() throws HibernateException {
  63.             try {
  64.                 Session s = (Session) threadSession.get();
  65.                 threadSession.set(null);
  66.                 if (s != null && s.isOpen())
  67.                     s.close();
  68.             }catch (HibernateException e) {
  69.                 throw e;
  70.             }
  71.         }
  72.        
  73.         public static void beginTransaction() throws HibernateException {
  74.             Transaction tx = (Transaction)threadTransaction.get();
  75.             try {
  76.                 if (tx==null) {
  77.                     tx = getSession().beginTransaction();
  78.                     threadTransaction.set(tx);
  79.                 }
  80.             }catch (HibernateException e) {
  81.                 throw e;
  82.             }
  83.         }
  84.        
  85.         public static void commitTransaction() throws HibernateException {
  86.             Transaction tx = (Transaction)threadTransaction.get();
  87.             try {
  88.                 if (tx!=null && !tx.wasCommitted() && !tx.wasRolledBack()) {
  89.                     tx.commit();
  90.                 }
  91.                 threadTransaction.set(null);
  92.             }catch (HibernateException e) {
  93.                 rollbackTransaction();
  94.                 throw e;
  95.             }
  96.         }
  97.        
  98.         public static void rollbackTransaction() throws HibernateException {
  99.             Transaction tx = (Transaction)threadTransaction.get();
  100.             try {
  101.                 threadTransaction.set(null);
  102.                 if (tx!=null && !tx.wasCommitted() && !tx.wasRolledBack()) {
  103.                     tx.rollback();
  104.                 }
  105.             }catch (HibernateException e) {               
  106.                 throw e;
  107.             }finally {
  108.                 closeSession();
  109.             }
  110.         }
  111.    
  112. }


 
 
Par contre, je viens de déceler un warning lors du lancement de mon serveur :  
 
 

Citation :

INFO http-8080-Processor25 org.hibernate.impl.SessionFactoryObjectFactory - Factory name: java:comp/env/hibernate/SessionFactory
 INFO http-8080-Processor25 org.hibernate.impl.SessionFactoryObjectFactory - Factory name: java:comp/env/hibernate/SessionFactory
 INFO http-8080-Processor25 org.hibernate.util.NamingHelper - JNDI InitialContext properties:{}
 INFO http-8080-Processor25 org.hibernate.util.NamingHelper - Creating subcontext: hibernate
 WARN http-8080-Processor25 org.hibernate.impl.SessionFactoryObjectFactory - Could not bind factory to JNDI
 javax.naming.NamingException: Le Contexte est en lecture seule
 at org.apache.naming.NamingContext.checkWritable(NamingContext.java:901)
 at org.apache.naming.NamingContext.createSubcontext(NamingContext.java:515)
 at org.apache.naming.NamingContext.createSubcontext(NamingContext.java:536)
 at org.hibernate.util.NamingHelper.bind(NamingHelper.java:69)
 at org.hibernate.impl.SessionFactoryObjectFactory.addInstance(SessionFactoryObjectFactory.java:90)
 at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:290)
 at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1176)
 at com.laposte.dirr.dri.pilotage.hibernate.HibernateUtil.<clinit>(HibernateUtil.java:48)
 at com.laposte.dirr.dri.pilotage.rh.RessourceFactory.findConnectedUserByLogin(RessourceFactory.java:322)
 at com.laposte.dirr.dri.pilotage.struts.action.utils.LoginAction.execute(LoginAction.java:36)
 at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
 at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226)
 at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)
 at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:415)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
 at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
 at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
 at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
 at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
 at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
 at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
 at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
 at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
 at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
 at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
 at java.lang.Thread.run(Unknown Source)


 
Est-ce de ce côté la qu'il faut que je regarde ??
Merci.

n°1301154
fixEF
Posté le 08-02-2006 à 11:53:20  profilanswer
 

Problème reglé.
En fait, ma classe HibernateUtil censée résoudre tous les problèmes de connection/transaction était foireuse.
Je ne l'utilise plus que pour ouvrir une nouvelle session et pour la clore. Je gere directement les transactions dans mes factory.
 
Autre point qui m'a surpris :
Un appel à :
 
finally {
   session.close();
}
 
déclenche une SessionException si la session est déja fermée !!...
J'ai donc, dans ma classe HibernateUtil, implémenté une méthode qui vérifie que la session n'a pas déja été fermée en fin de transaction, avant l'appel à session.close().
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [hibernate] SessionException...

 

Sujets relatifs
[HIBERNATE] mappings dynamique possible ?Hibernate Commande SQL direct
[HIBERNATE][XDOCLET] Mapping clef composite, table de relation[Hibernate] Sous-classe et association
[Hibernate] pb lors de la migration de wsad V5 ==> V6[hibernate + eclipse] probleme de mapping et de compilation
[Hibernate] Erreur de mapping[hibernate] probleme avec un filtre, et DB2 : "invalid parameter nb"
[hibernate] Parser le résultat d une requete hibernate avec du xsl[Debutant] Problème Hibernate
Plus de sujets relatifs à : [hibernate] SessionException...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR