Hi,
We are running a web application with JBoss 4.0.4.GA. We are not
using EJBs, just an EAR with a WAR and a HAR file.
Some of the processes in the web application run for over 5 minutes
and depending on the number of users may timeout, as TransactionTimeout
is set to 300 in server/default/conf/jboss-service.xml.
System info:
Hibernate : 3.2 cr2
RDBMS : MySQL, version: 5.0.16
JDBC driver : mysql-connector-java-3.0.16-ga
Application : JBoss 4.0.4.GA
server
After a long-running transaction times out I get the following stacktrace. I
can no longer use the sesson factory after this has happened, i.e. any
time I try to log into the application I get the error below. Has anyone had
this error?
Any ideas on how to fix it? Really need some help here as this
forces us to restart our application.
I've included our HibernateUtil.java file after the stack trace.
Thanks in advance,
Robert
2006-06-09 18:28:58,711 http-0.0.0.0-80-8 ERROR HibernateUtil:119: [HibernateUtil] caught while trying to get session threadSession=[null]threadTransaction=[null]
org.hibernate.TransactionException: could not register synchronization with JTA TransactionManager
at org.hibernate.jdbc.JDBCContext.registerSynchronizationIfPossible(JDBCContext.java:174)
at org.hibernate.jdbc.JDBCContext.<init>(JDBCContext.java:75)
at org.hibernate.impl.SessionImpl.<init>(SessionImpl.java:215)
at org.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:470)
at org.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:494)
at org.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:502)
.
.
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:697)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
at java.lang.Thread.run(Thread.java:595)
Caused by: javax.transaction.RollbackException: Already marked for rollback TransactionImpl:XidImpl[FormatId=257, GlobalId=ORANGE02/27350, BranchQual=, localId=27350]
at org.jboss.tm.TransactionImpl.registerSynchronization(TransactionImpl.java:635)
at org.hibernate.jdbc.JDBCContext.registerSynchronizationIfPossible(JDBCContext.java:164)
... 34 more
public class HibernateUtil
{
private static final ThreadLocal threadSession = new ThreadLocal();
private static final ThreadLocal threadTransaction = new ThreadLocal();
public static String toStaticString()
{
StringBuffer buf = new StringBuffer("");
if(((Session)threadSession.get())!= null)
{
buf.append("threadSession=[");
buf.append("open=" + ((Session)threadSession.get()).isOpen() + ", ");
buf.append("connected=" + ((Session)threadSession.get()).isConnected() + "], ");
}
else
{
buf.append("threadSession=[null]");
}
if(((Transaction)threadTransaction.get()) != null)
{
buf.append("threadTransaction=[");
buf.append("active=" + ((Transaction)threadTransaction.get()).isActive() + ", ");
buf.append("wasCommitted=" + ((Transaction)threadTransaction.get()).wasCommitted() + ", ");
buf.append("wasRolledBack=" + ((Transaction)threadTransaction.get()).wasRolledBack() + "]");
}
else
{
buf.append("threadTransaction=[null]");
}
return buf.toString();
}
public static Session getSession()
{
Session s = null;
try
{
log.debug("Getting session [1] ->" + toStaticString());
s = (Session)threadSession.get();
log.debug("Getting session [2] ->" + toStaticString());
if(s == null || !s.isOpen() || !s.isConnected())
{
s = HibernateSessionFactory.getSession();
threadSession.set(s);
}
log.debug("Getting session [3] ->" + toStaticString());
}
catch(HibernateException e)
{
log.error("[HibernateUtil] caught while trying to get session " + toStaticString(), e);
}
return s;
}
public static void closeSession()
{
try
{
log.debug("Closing session [1] ->" + toStaticString());
Session s = (Session)threadSession.get();
log.debug("Closing session [2] ->" + toStaticString());
if(s != null)
{
if(s.isOpen())
{
s.flush();
s.disconnect();
}
}
log.debug("Closing session [3] ->" + toStaticString());
threadSession.set(null);
}
catch(HibernateException e)
{
log.error("caught while trying to close session " + toStaticString(), e);
}
}
public static void beginTransaction()
{
Transaction tx = (Transaction)threadTransaction.get();
log.debug("Beginning transaction " + toStaticString());
try
{
Session s = getSession();
if(tx == null)
{
if(s != null)
{
if(s.isOpen())
{
tx = s.beginTransaction();
threadTransaction.set(tx);
}
else
{
log.warn("Session is not open");
}
}
}
/*else
{
if(!tx.isActive() && s.isOpen())
{
tx.begin();
threadTransaction.set(tx);
}
}*/
}
catch(HibernateException e)
{
log.error("[HibernateUtil] caught while trying to start transaction " + toStaticString(), e);
}
}
public static void commitTransaction()
{
Transaction tx = (Transaction)threadTransaction.get();
log.debug("Committing transaction " + toStaticString());
try
{
if(tx != null)
{
if(tx.isActive() && !tx.wasCommitted() && !tx.wasRolledBack())
{
tx.commit();
}
}
threadTransaction.set(null);
}
catch(HibernateException e)
{
log.error("[HibernateUtil] caught while committing transaction " + toStaticString(), e);
}
}
public static void rollbackTransaction()
{
log.info("rolling back transaction ...");
Transaction tx = (Transaction)threadTransaction.get();
try
{
threadTransaction.set(null);
if(tx != null && !tx.wasCommitted() && !tx.wasRolledBack())
{
tx.rollback();
log.info("done rolling back transaction");
}
else
{
log.info("tx was null, already committed or rolled back - no rollback needed");
}
}
catch(HibernateException ex)
{
log.error("could not roll back transaction " + toStaticString(), ex);
}
finally
{
closeSession();
}
}
}
|