[jboss-user] [EJB/JBoss] - Bean method called from within transaction cannot open conne

branez do-not-reply at jboss.com
Thu Dec 27 17:27:49 EST 2007


Context: JBoss 4.0.5 , EJB Container-managed transactions, local MySQL db

I started out doing this using BMT but since I have no need for custom handling of transaction, I thought I would switch to CMT. In the code below,  I have some pretty basic functions. I can and do call find() directly and it works fine. The problem occurs when I have the case of a duplicate entry and I enter the EntityExistsException's catch block. When the find() within that catch block is called, getSingleResult() in find() throws a GenericJDBCException stating that a connection cannot be opened, which in turn is caused by a "Transaction is inactive" problem. 

CMTBean provides the injected entitymanager reference.

What happens to the transaction in the catch block that causes find() (which is by default of the REQUIRED transaction policy) to lose the connection? EntityExistsException does not cause a rollback and even if it did, find() would start its own transaction, would it not?

Your prompt responses are appreciated.


  | @Stateless
  | @TransactionAttribute(TransactionAttributeType.REQUIRED)
  | public class MyBean extends CMTBean implements MyBeanLocal{
  | 
  |     public List<Item> addItems(List<Item> items) {
  | 	List<Item> mergedList = new ArrayList<Item>();
  | 	for(Item item:items){
  | 
  |             //Call another bean method
  |             mergedList.add(addItem(item));
  | 
  | 	}
  | 	return mergedList;
  |     }
  | 	
  |     public Item addItem(Item item){
  | 	try{
  | 	    item = em.merge(item);
  | 	}
  | 	catch (EntityExistsException ex){
  | 
  |             //Since item exists, call another bean method to retrieve it
  | 	    item = find(item.getName());
  | 
  | 	}
  | 	return item;
  |     }
  | 
  |     public Item find(String name){
  | 	Query query = null;
  | 	Item item = null;
  | 
  | 	try {
  | 	    query = em.createQuery("SELECT it FROM Item it WHERE it.name=:name");
  | 	    query = query.setParameter("name", name);
  | 
  |             // GenericJDBCException thrown here - "Cannot open connection."
  | 	    item = (Item) query.getSingleResult();
  | 
  | 	}
  |         catch (...)
  |             //error handling
  | 	} 
  | 	return item;
  |     }
  | }
  | 

The pertinent parts of the stacktrace:

17:17:26,874 ERROR [JDBCExceptionReporter] Transaction is not active: tx=TransactionImpl:XidImpl[FormatId=257, GlobalId=local/24, BranchQual=, localId=24]; - nested throwable: (javax.resource.ResourceException: Transaction is not active: tx=TransactionImpl:XidImpl[FormatId=257, GlobalId=local/24, BranchQual=, localId=24])
17:17:26,905 ERROR [STDERR] Exception in thread "Thread-28" 
17:17:26,905 ERROR [STDERR] javax.ejb.EJBException: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Cannot open connection
17:17:26,905 ERROR [STDERR] 	at org.jboss.ejb3.tx.Ejb3TxPolicy.handleExceptionInOurTx(Ejb3TxPolicy.java:69)
17:17:26,905 ERROR [STDERR] 	at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:83)
17:17:26,905 ERROR [STDERR] 	at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:191)
17:17:26,905 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
17:17:26,905 ERROR [STDERR] 	at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
17:17:26,905 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
17:17:26,905 ERROR [STDERR] 	at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62)
17:17:26,905 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
17:17:26,905 ERROR [STDERR] 	at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77)
17:17:26,905 ERROR [STDERR] 	at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:102)
17:17:26,905 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
17:17:26,905 ERROR [STDERR] 	at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:47)
17:17:26,905 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
17:17:26,905 ERROR [STDERR] 	at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
17:17:26,905 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
17:17:26,905 ERROR [STDERR] 	at org.jboss.ejb3.stateless.StatelessContainer.localInvoke(StatelessContainer.java:211)
17:17:26,905 ERROR [STDERR] 	at org.jboss.ejb3.stateless.StatelessLocalProxy.invoke(StatelessLocalProxy.java:79)
17:17:26,905 ERROR [STDERR] 	at $Proxy85.addRootItems(Unknown Source)
17:17:26,905 ERROR [STDERR] 	at commit(ServerScanner.java:171)
17:17:26,905 ERROR [STDERR] 	at CommitThread.run(CommitThread.java:163)
17:17:26,905 ERROR [STDERR] Caused by: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Cannot open connection
17:17:26,905 ERROR [STDERR] 	at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:647)
17:17:26,905 ERROR [STDERR] 	at org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:99)
17:17:26,905 ERROR [STDERR] 	at MyBean.findUrl(MyBean.java:112)
17:17:26,905 ERROR [STDERR] 	at MyBean.addRootItem(MyBean.java:51)
17:17:26,905 ERROR [STDERR] 	at MyBean.addRootItems(MyBean.java:90)
17:17:26,905 ERROR [STDERR] 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
17:17:26,905 ERROR [STDERR] 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
17:17:26,905 ERROR [STDERR] 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
17:17:26,905 ERROR [STDERR] 	at java.lang.reflect.Method.invoke(Method.java:585)
17:17:26,921 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:112)
17:17:26,921 ERROR [STDERR] 	at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:166)
17:17:26,921 ERROR [STDERR] 	at org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63)
17:17:26,921 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
17:17:26,921 ERROR [STDERR] 	at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54)
17:17:26,921 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
17:17:26,921 ERROR [STDERR] 	at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:46)
17:17:26,921 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
17:17:26,921 ERROR [STDERR] 	at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:79)
17:17:26,921 ERROR [STDERR] 	... 18 more
17:17:26,921 ERROR [STDERR] Caused by: org.hibernate.exception.GenericJDBCException: Cannot open connection
17:17:26,921 ERROR [STDERR] 	at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
17:17:26,921 ERROR [STDERR] 	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
17:17:26,921 ERROR [STDERR] 	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
17:17:26,921 ERROR [STDERR] 	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:29)
17:17:26,921 ERROR [STDERR] 	at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:420)
17:17:26,921 ERROR [STDERR] 	at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
17:17:26,921 ERROR [STDERR] 	at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:139)
17:17:26,921 ERROR [STDERR] 	at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1560)
17:17:26,921 ERROR [STDERR] 	at org.hibernate.loader.Loader.doQuery(Loader.java:661)
17:17:26,921 ERROR [STDERR] 	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
17:17:26,921 ERROR [STDERR] 	at org.hibernate.loader.Loader.doList(Loader.java:2144)
17:17:26,921 ERROR [STDERR] 	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2028)
17:17:26,921 ERROR [STDERR] 	at org.hibernate.loader.Loader.list(Loader.java:2023)
17:17:26,921 ERROR [STDERR] 	at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:393)
17:17:26,921 ERROR [STDERR] 	at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
17:17:26,921 ERROR [STDERR] 	at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
17:17:26,921 ERROR [STDERR] 	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
17:17:26,921 ERROR [STDERR] 	at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
17:17:26,921 ERROR [STDERR] 	at org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:80)
17:17:26,921 ERROR [STDERR] 	... 34 more
17:17:26,921 ERROR [STDERR] Caused by: org.jboss.util.NestedSQLException: Transaction is not active: tx=TransactionImpl:XidImpl[FormatId=257, GlobalId=local/24, BranchQual=, localId=24]; - nested throwable: (javax.resource.ResourceException: Transaction is not active: tx=TransactionImpl:XidImpl[FormatId=257, GlobalId=local/24, BranchQual=, localId=24])
17:17:26,921 ERROR [STDERR] 	at org.jboss.resource.adapter.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:94)
17:17:26,921 ERROR [STDERR] 	at org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider.getConnection(InjectedDataSourceConnectionProvider.java:47)
17:17:26,921 ERROR [STDERR] 	at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:417)
17:17:26,921 ERROR [STDERR] 	... 48 more
17:17:26,921 ERROR [STDERR] Caused by: javax.resource.ResourceException: Transaction is not active: tx=TransactionImpl:XidImpl[FormatId=257, GlobalId=local/24, BranchQual=, localId=24]
17:17:26,921 ERROR [STDERR] 	at org.jboss.resource.connectionmanager.TxConnectionManager.getManagedConnection(TxConnectionManager.java:290)
17:17:26,921 ERROR [STDERR] 	at org.jboss.resource.connectionmanager.BaseConnectionManager2.allocateConnection(BaseConnectionManager2.java:396)
17:17:26,921 ERROR [STDERR] 	at org.jboss.resource.connectionmanager.BaseConnectionManager2$ConnectionManagerProxy.allocateConnection(BaseConnectionManager2.java:842)
17:17:26,921 ERROR [STDERR] 	at org.jboss.resource.adapter.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:88)
17:17:26,921 ERROR [STDERR] 	... 50 more

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4115804#4115804

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4115804



More information about the jboss-user mailing list