[hibernate] SessionException...

SessionException... [hibernate] - Java - Programmation

Marsh Posté le 06-02-2006 à 15:46:39    

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 !!

Reply

Marsh Posté le 06-02-2006 à 15:46:39   

Reply

Marsh Posté le 06-02-2006 à 20:27:26    

et la tronche de l'exception ?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 07-02-2006 à 15:06:24    

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.

Reply

Marsh Posté le 08-02-2006 à 11:53:20    

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().
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed