Hi,
I am experiencing a hung database in the following setup.
I'm running GlassFish 3.0.1 on Linux. DB2 9.7 with type 4 driver.
I have a Quartz job that invokes a stateless session bean (method myBeanMethod) with a container managed transaction (RequiresNew).
The bean method communicates with my DB2 in two ways.
1) It starts off with doing a number of SQL queries using straight JDBC. Every query fetch a connection from the connection pool defined i GlassFish (jdbc/mydatasource).
2) Last it updates some data using Hibernate. Hibernate is configured to use the same data source in GlassFish as the straight JDBC code.
I have set the following properties on my Hibernate session factory:
Code:
hibernate.transaction.factory_class=org.hibernate.transaction.CMTTransactionFactory
hibernate.transaction.manager_lookup_class=org.hibernate.transaction.SunONETransactionManagerLookup
hibernate.jta.UserTransaction=javax.transaction.UserTransaction
hibernate.connection.datasource=java:comp/env/jdbc/mydatasource
hibernate.current_session_context_class=jta
My experience is that the Quartz job completes without any exceptions being thrown but some part of my database in locked until I kill the GlassFish process.
If I omit the Hibernate code (step 2 from above) everything is OK, the database is not locked.
When I turn on leak detection in GlassFish the following stack trace shows up which indicated that a dead lock is present during CacheSynchronization.beforeCompletion.
If I manually close the hibernate session when I'm done using it in the tx everything works fine (instead of relying it being done for me during tx commit). Howerver, I would like to avoid doing the manually closing of Hibernate sessions and let the transaction manager do it for me.
Any ideas to why this is not working for me? Any help/comments would be appreciated.
Code:
[#|2010-09-29T15:06:41.270+0200|WARNING|glassfish3.0.1|javax.enterprise.resource.resourceadapter.com.sun.enterprise.resource.pool|_ThreadID=28;_ThreadName=Thread-1;|A potential connection leak detected for connection pool MyPoolTx. The stack trace of the thread is provided below :
com.sun.enterprise.resource.pool.ConnectionPool.setResourceStateToBusy(ConnectionPool.java:319)
com.sun.enterprise.resource.pool.ConnectionPool.getResourceFromPool(ConnectionPool.java:694)
com.sun.enterprise.resource.pool.ConnectionPool.getUnenlistedResource(ConnectionPool.java:572)
com.sun.enterprise.resource.pool.ConnectionPool.internalGetResource(ConnectionPool.java:467)
com.sun.enterprise.resource.pool.ConnectionPool.getResource(ConnectionPool.java:369)
com.sun.enterprise.resource.pool.PoolManagerImpl.getResourceFromPool(PoolManagerImpl.java:226)
com.sun.enterprise.resource.pool.PoolManagerImpl.getResource(PoolManagerImpl.java:150)
com.sun.enterprise.connectors.ConnectionManagerImpl.getResource(ConnectionManagerImpl.java:321)
com.sun.enterprise.connectors.ConnectionManagerImpl.internalGetConnection(ConnectionManagerImpl.java:290)
com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:182)
com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:159)
com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:154)
com.sun.gjc.spi.base.DataSource.getConnection(DataSource.java:105)
org.hibernate.connection.DatasourceConnectionProvider.getConnection(DatasourceConnectionProvider.java:92)
org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:116)
org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109)
org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:244)
org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2382)
org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2335)
org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2635)
org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:115)
org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:168)
org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)
org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365)
org.hibernate.transaction.CacheSynchronization.beforeCompletion(CacheSynchronization.java:88)
com.sun.jts.jta.SynchronizationImpl.before_completion(SynchronizationImpl.java:99)
com.sun.jts.CosTransactions.RegisteredSyncs.distributeBefore(RegisteredSyncs.java:158)
com.sun.jts.CosTransactions.TopCoordinator.beforeCompletion(TopCoordinator.java:2551)
com.sun.jts.CosTransactions.CoordinatorTerm.commit(CoordinatorTerm.java:278)
com.sun.jts.CosTransactions.TerminatorImpl.commit(TerminatorImpl.java:251)
com.sun.jts.CosTransactions.CurrentImpl.commit(CurrentImpl.java:623)
com.sun.jts.jta.TransactionManagerImpl.commit(TransactionManagerImpl.java:318)
com.sun.enterprise.transaction.jts.JavaEETransactionManagerJTSDelegate.commitDistributedTransaction(JavaEETransactionManagerJTSDelegate.java:171)
com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.commit(JavaEETransactionManagerSimplified.java:843)
com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5040)
com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4805)
com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2004)
com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1955)
com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:208)
com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:118)
$Proxy181.myBeanMethod(Unknown Source)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:228)
com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:147)
com.sun.corba.ee.impl.presentation.rmi.codegen.CodegenStubBase.invoke(CodegenStubBase.java:225)
...
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.quartz.jobs.ee.ejb.EJBInvokerJob.execute(EJBInvokerJob.java:230)
...
org.quartz.core.JobRunShell.run(JobRunShell.java:202)
org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:534)