-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 
Author Message
 Post subject: OutOfMemoryError at openSession in JTATransaction
PostPosted: Thu Sep 17, 2009 12:34 pm 
Newbie

Joined: Tue Mar 11, 2008 1:45 pm
Posts: 4
Hi.
I implemented a transaction hibernate-jta architecture into JBoss 4.2.1 and MySql 5 and with hibernate 3.1.

On a Redhat machine, even with large memory settings on JVM, sometimes the server throws an OutOfMemoryError
at org.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:535)

So, these are my relevant classes and methods and configuration file.

Code:
<hibernate-configuration>
    <session-factory name="java:hibernate/SessionFactory">
   
        <property name="hibernate.connection.datasource">java:SicrelDS</property>
          <property name="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup</property>
      <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
        <property name="show_sql">true</property>
       
        <mapping resource="it/lait/sicrel/data/dao/TabErpCrelSeduComm.hbm.xml" />
    </session-factory>
</hibernate-configuration>



Code:
public class HibernateTransaction implements TransactionHelper{
   private static Transaction transaction;

   public void commitTransaction() throws ProjectException{
      try {
         transaction.commit();
      } catch (Exception e) {
         ProjectLogger.getLogger().error("Errore di commit",e);
         throw new ProjectException(e,"Errore di commit",ProjectException.TypeOfException.HIBERNATE_EXCEPTION);
      }
   }
   public void rollbackTransaction() throws ProjectException{
      try {
         transaction.rollback();
      } catch (Exception e) {
         ProjectLogger.getLogger().error("Errore di rollback",e);
         throw new ProjectException(e,"Errore di rollback",ProjectException.TypeOfException.HIBERNATE_EXCEPTION);
      }

   }

   public void startTransaction() throws ProjectException{
      try {
         Session session = HibernateSession.getIstance().createSession();
         transaction = session.beginTransaction();
      } catch (Exception e) {
         ProjectLogger.getLogger().error("Errore di beginTransaction",e);
         throw new ProjectException(e,"Errore di beginTransaction",ProjectException.TypeOfException.HIBERNATE_EXCEPTION);
      }
   }

   public void endTransaction() throws ProjectException{
      try{
         transaction = null;
         HibernateSession.getIstance().closeSession();
      }catch(Exception e){
         ProjectLogger.getLogger().error("Errore di closeSession",e);
         throw new ProjectException(e,"Errore di closeSession",ProjectException.TypeOfException.HIBERNATE_EXCEPTION);
      }
   }
}




Code:
public class HibernateSession {
   private static HibernateSession instance;
   private Session session = null;

   public static HibernateSession getIstance(){
      if (instance == null) {
         synchronized (HibernateSession.class) {
            if (instance == null) {
               instance = new HibernateSession();
            }
         }
      }
      return instance;
   }


   /**
    *
    * @return org.hibernate.Session
    */
   public Session createSession() {
      session = HibernateUtil.getSessionFactory().openSession();
       return session;

   }

   public Session currentSession() {
      return session;
   }

   public void closeSession() {
       if (session != null){
            session.close();
       }
   }
}



Code:
public class HibernateUtil {
   
   private static Logger log = Logger.getLogger(HibernateUtil.class);
   
   private static final SessionFactory sessionFactory;
   private static final Configuration configuration;
   
   static {
      try {
         // Create the SessionFactory from hibernate.cfg.xml

         String hibernateCfgPath = Configurator.getHibernateConfigPath() + "hibernate.cfg.xml";
         String hibernateHbmPath = Configurator.getHibernateConfigPath() + "hbm";

         File hibernateFile = new File(hibernateCfgPath);
         configuration = new Configuration().configure(hibernateFile);      
         sessionFactory = configuration.buildSessionFactory();
         
      } catch (Throwable ex) {
         // Make sure you log the exception, as it might be swallowed
         log.error("Initial SessionFactory creation failed." /* + Utility.getStackTrace(ex)*/);
         throw new ExceptionInInitializerError(ex);
      }
   }

   public static SessionFactory getSessionFactory() {
      return sessionFactory;
   }
}


Finally, this is my Business Class

Code:
public class BusinessDispatcher {

   private TransactionHelper transaction;
   
   public Command executeCommand(Command command, Strategie strategia) throws ProjectException {
      ProjectLogger.getLogger().debug("Start");
      Strategy strategy = StrategyFactory.getStrategy(strategia, command.getRisorsa());
      Command result = null;
      transaction = new HibernateTransaction();
      try{
         transaction.startTransaction();
         StandardDTO sigemiDTO = command.getRecord();

         if(sigemiDTO !=null){
            result = strategy.execute(command);
         }
         transaction.commitTransaction();
      }catch(ProjectException e){   
         transaction.rollbackTransaction();
         throw e;
      }catch(Exception e){
         transaction.rollbackTransaction();
         throw new ProjectException(e,ProjectException.TypeOfException.APPLICATION_EXCEPTION);
      }finally{
         transaction.endTransaction();
      }
      ProjectLogger.getLogger().debug("Finish");      
      return result;
   }
}




and this is the datasource configuration on JBoss

Code:
<datasources>
  <local-tx-datasource>
    <jndi-name>SicrelDS</jndi-name>
    <connection-url>jdbc:mysql://localhost:3306/SICREL?autoReconnect=true</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>sicrel</user-name>
    <password>sicrel</password>
    <blocking-timeout-millis>5000</blocking-timeout-millis>
    <min-pool-size>5</min-pool-size>
    <max-pool-size>50</max-pool-size>
    <check-valid-connection-sql>select count(*) from SICREL.TAB_ERP_CREL_USER</check-valid-connection-sql>
    <idle-timeout-minutes>1</idle-timeout-minutes>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
    <metadata>
         <type-mapping>mySQL</type-mapping>
    </metadata>
  </local-tx-datasource>

</datasources>


Well. On my machine (Windows Vista as OS) works all perfectly and I've not any trouble.
But, on a Redhat machine, sometimes the server goes into OutOfMemoryError
at org.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:503)

This is the complete stacktrace

Code:
java.lang.OutOfMemoryError: PermGen space
   at java.lang.ClassLoader.defineClass1(Native Method)
   at java.lang.ClassLoader.defineClass(ClassLoader.java:637)
   at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
   at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1814)
   at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:872)
   at org.jboss.web.tomcat.service.WebAppClassLoader.findClass(WebAppClassLoader.java:75)
   at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1325)
   at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204)
   at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:336)
   at org.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:503)
   at org.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:527)
   at org.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:535)
   at it.lait.sicrel.web.connector.HibernateSession.createSession(HibernateSession.java:39)
   at it.lait.sicrel.web.connector.HibernateTransaction.startTransaction(HibernateTransaction.java:36)
   at it.lait.sicrel.web.connector.BusinessDispatcher.executeCommand(BusinessDispatcher.java:46)



Any suggest?
Thanks in advance


Top
 Profile  
 
 Post subject: Re: OutOfMemoryError at openSession in JTATransaction
PostPosted: Thu Sep 17, 2009 1:21 pm 
Newbie

Joined: Tue Mar 11, 2008 1:45 pm
Posts: 4
I would add another information.

Into the same server an another identical war is deployed (different from the first only for the web.xml).

I had a trouble because before, into the HibernateUtil class I retrieved the SessionFactory with this code

Code:
 

   public static SessionFactory getSessionFactory() {
      try {
         return (SessionFactory)new InitialContext().lookup("java:hibernate/SessionFactory");
      } catch (NamingException e) {
         e.printStackTrace();
         return sessionFactory;
      }
   }

 


So, when the second war invoke this method it ha a conflict JNDI Name problem caused by the same JNDI name into the identical hibernate.cfg.xml

The two war presence could be the cause again?


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.