[RESOLVIDO]Problemas com transações - EJB

8 respostas
vinicius_jssouza

Pessoal, estou trabalhando num sistema em que um cliente standalone swing acessa a camada de negócios através de EJBs. Devido à algumas exigências, fui obrigado a utilizar o gerenciamento explícito de transação no cliente através da api UserTransaction. O problema é que, quando o sistema possuía transação gerenciada pelo container ejb estava tudo ok. Porém, com o gerenciamento explícito ocorrem excessões no servidor pouco informativas (ao menos para mim). Me parece que para este caso eu necessitaria de transações XA.
Estamos utilizando como servidor o glassFish v2 e EJB 3.0. Segue a exceção ocorrida no servidor:

RAR5027:Unexpected exception in resource pooling

java.lang.IllegalStateException: cannot add non-XA Resource to global JTS transaction.

at com.sun.enterprise.distributedtx.J2EETransactionManagerOpt.enlistResource(J2EETransactionManagerOpt.java:148)

at com.sun.enterprise.resource.SystemResourceManagerImpl.enlistResource(SystemResourceManagerImpl.java:98)

at com.sun.enterprise.resource.PoolManagerImpl.getResource(PoolManagerImpl.java:216)

at com.sun.enterprise.connectors.ConnectionManagerImpl.internalGetConnection(ConnectionManagerImpl.java:327)

at com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:189)

at com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:165)

at com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:158)

at com.sun.gjc.spi.base.DataSource.getConnection(DataSource.java:108)

at oracle.toplink.essentials.jndi.JNDIConnector.connect(JNDIConnector.java:145)

at oracle.toplink.essentials.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:184)

at oracle.toplink.essentials.internal.databaseaccess.DatasourceAccessor.connect(DatasourceAccessor.java:233)

at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.connect(DatabaseAccessor.java:242)

at oracle.toplink.essentials.internal.databaseaccess.DatasourceAccessor.reconnect(DatasourceAccessor.java:436)

at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.reconnect(DatabaseAccessor.java:1177)

at oracle.toplink.essentials.internal.databaseaccess.DatasourceAccessor.incrementCallCount(DatasourceAccessor.java:220)

at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:479)

at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:452)

at oracle.toplink.essentials.internal.sessions.AbstractSession.executeCall(AbstractSession.java:690)

at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:228)

at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:214)

at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.executeNoSelectCall(DatasourceCallQueryMechanism.java:257)

at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.executeNoSelect(DatasourceCallQueryMechanism.java:237)

at oracle.toplink.essentials.queryframework.DataModifyQuery.executeDatabaseQuery(DataModifyQuery.java:86)

at oracle.toplink.essentials.queryframework.DatabaseQuery.execute(DatabaseQuery.java:628)

at oracle.toplink.essentials.internal.sessions.AbstractSession.internalExecuteQuery(AbstractSession.java:1834)

at oracle.toplink.essentials.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:952)

at oracle.toplink.essentials.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:924)

at oracle.toplink.essentials.sequencing.QuerySequence.update(QuerySequence.java:344)

at oracle.toplink.essentials.sequencing.QuerySequence.updateAndSelectSequence(QuerySequence.java:283)

at oracle.toplink.essentials.sequencing.StandardSequence.getGeneratedVector(StandardSequence.java:96)

at oracle.toplink.essentials.sequencing.DefaultSequence.getGeneratedVector(DefaultSequence.java:168)

at oracle.toplink.essentials.sequencing.Sequence.getGeneratedVector(Sequence.java:281)

at oracle.toplink.essentials.internal.sequencing.SequencingManager$Preallocation_Transaction_NoAccessor_State.getNextValue(SequencingManager.java:420)

at oracle.toplink.essentials.internal.sequencing.SequencingManager.getNextValue(SequencingManager.java:848)

at oracle.toplink.essentials.internal.sequencing.ClientSessionSequencing.getNextValue(ClientSessionSequencing.java:110)

at oracle.toplink.essentials.internal.descriptors.ObjectBuilder.assignSequenceNumber(ObjectBuilder.java:240)

at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.assignSequenceNumber(UnitOfWorkImpl.java:355)

at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.registerNotRegisteredNewObjectForPersist(UnitOfWorkImpl.java:3260)

at oracle.toplink.essentials.internal.ejb.cmp3.base.RepeatableWriteUnitOfWork.registerNotRegisteredNewObjectForPersist(RepeatableWriteUnitOfWork.java:339)

at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersist(UnitOfWorkImpl.java:3220)

at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl.persist(EntityManagerImpl.java:205)

at com.sun.enterprise.util.EntityManagerWrapper.persist(EntityManagerWrapper.java:238)

at com.business.DAO.GenericDAOImpl.save(GenericDAOImpl.java:62)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1067)

at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:176)

at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2895)

at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:3986)

at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:203)

at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:77)

at $Proxy60.save(Unknown Source)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)

at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)

at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)

at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)

at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)

at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)

at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)

at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)

at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)

at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)

at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)

poolmgr.err_enlisting_res_in_getconn

RAR5117 : Failed to obtain/create connection from connection pool [ JCheckoutPool ]. Reason : java.lang.IllegalStateException: cannot add non-XA Resource to global JTS transaction.

RAR5114 : Error allocating connection : [Error in allocating a connection. Cause: java.lang.IllegalStateException: cannot add non-XA Resource to global JTS transaction.]

Local Exception Stack:

Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b04-fcs (04/17/2008))): oracle.toplink.essentials.exceptions.DatabaseException

Internal Exception: java.sql.SQLException: Error in allocating a connection. Cause: java.lang.IllegalStateException: cannot add non-XA Resource to global JTS transaction.

Error Code: 0

Call: SQLCall(UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?)

Query: DataModifyQuery()

at oracle.toplink.essentials.exceptions.DatabaseException.sqlException(DatabaseException.java:305)

at oracle.toplink.essentials.jndi.JNDIConnector.connect(JNDIConnector.java:150)

at oracle.toplink.essentials.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:184)

at oracle.toplink.essentials.internal.databaseaccess.DatasourceAccessor.connect(DatasourceAccessor.java:233)

at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.connect(DatabaseAccessor.java:242)

at oracle.toplink.essentials.internal.databaseaccess.DatasourceAccessor.reconnect(DatasourceAccessor.java:436)

at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.reconnect(DatabaseAccessor.java:1177)

at oracle.toplink.essentials.internal.databaseaccess.DatasourceAccessor.incrementCallCount(DatasourceAccessor.java:220)

at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:479)

at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:452)

at oracle.toplink.essentials.internal.sessions.AbstractSession.executeCall(AbstractSession.java:690)

at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:228)

at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:214)

at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.executeNoSelectCall(DatasourceCallQueryMechanism.java:257)

at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.executeNoSelect(DatasourceCallQueryMechanism.java:237)

at oracle.toplink.essentials.queryframework.DataModifyQuery.executeDatabaseQuery(DataModifyQuery.java:86)

at oracle.toplink.essentials.queryframework.DatabaseQuery.execute(DatabaseQuery.java:628)

at oracle.toplink.essentials.internal.sessions.AbstractSession.internalExecuteQuery(AbstractSession.java:1834)

at oracle.toplink.essentials.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:952)

at oracle.toplink.essentials.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:924)

at oracle.toplink.essentials.sequencing.QuerySequence.update(QuerySequence.java:344)

at oracle.toplink.essentials.sequencing.QuerySequence.updateAndSelectSequence(QuerySequence.java:283)

at oracle.toplink.essentials.sequencing.StandardSequence.getGeneratedVector(StandardSequence.java:96)

at oracle.toplink.essentials.sequencing.DefaultSequence.getGeneratedVector(DefaultSequence.java:168)

at oracle.toplink.essentials.sequencing.Sequence.getGeneratedVector(Sequence.java:281)

at oracle.toplink.essentials.internal.sequencing.SequencingManager$Preallocation_Transaction_NoAccessor_State.getNextValue(SequencingManager.java:420)

at oracle.toplink.essentials.internal.sequencing.SequencingManager.getNextValue(SequencingManager.java:848)

at oracle.toplink.essentials.internal.sequencing.ClientSessionSequencing.getNextValue(ClientSessionSequencing.java:110)

at oracle.toplink.essentials.internal.descriptors.ObjectBuilder.assignSequenceNumber(ObjectBuilder.java:240)

at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.assignSequenceNumber(UnitOfWorkImpl.java:355)

at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.registerNotRegisteredNewObjectForPersist(UnitOfWorkImpl.java:3260)

at oracle.toplink.essentials.internal.ejb.cmp3.base.RepeatableWriteUnitOfWork.registerNotRegisteredNewObjectForPersist(RepeatableWriteUnitOfWork.java:339)

at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersist(UnitOfWorkImpl.java:3220)

at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl.persist(EntityManagerImpl.java:205)

at com.sun.enterprise.util.EntityManagerWrapper.persist(EntityManagerWrapper.java:238)

at com.business.DAO.GenericDAOImpl.save(GenericDAOImpl.java:62)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1067)

at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:176)

at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2895)

at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:3986)

at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:203)

at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:77)

at $Proxy60.save(Unknown Source)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)

at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)

at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)

at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)

at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)

at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)

at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)

at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)

at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)

at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)

at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)

Caused by: java.sql.SQLException: Error in allocating a connection. Cause: java.lang.IllegalStateException: cannot add non-XA Resource to global JTS transaction.

at com.sun.gjc.spi.base.DataSource.getConnection(DataSource.java:115)

at oracle.toplink.essentials.jndi.JNDIConnector.connect(JNDIConnector.java:145)

 60 more

EJB5018: An exception was thrown during an ejb invocation on [UsuarioDAOBean]

javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean; nested exception is: Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b04-fcs (04/17/2008))): oracle.toplink.essentials.exceptions.DatabaseException

Internal Exception: java.sql.SQLException: Error in allocating a connection. Cause: java.lang.IllegalStateException: cannot add non-XA Resource to global JTS transaction.

Error Code: 0

Call: SQLCall(UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?)

Query: DataModifyQuery()

Local Exception Stack:

Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b04-fcs (04/17/2008))): oracle.toplink.essentials.exceptions.DatabaseException

Internal Exception: java.sql.SQLException: Error in allocating a connection. Cause: java.lang.IllegalStateException: cannot add non-XA Resource to global JTS transaction.

Error Code: 0

Call: SQLCall(UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?)

Query: DataModifyQuery()

at oracle.toplink.essentials.exceptions.DatabaseException.sqlException(DatabaseException.java:305)

at oracle.toplink.essentials.jndi.JNDIConnector.connect(JNDIConnector.java:150)

at oracle.toplink.essentials.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:184)

at oracle.toplink.essentials.internal.databaseaccess.DatasourceAccessor.connect(DatasourceAccessor.java:233)

at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.connect(DatabaseAccessor.java:242)

at oracle.toplink.essentials.internal.databaseaccess.DatasourceAccessor.reconnect(DatasourceAccessor.java:436)

at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.reconnect(DatabaseAccessor.java:1177)

at oracle.toplink.essentials.internal.databaseaccess.DatasourceAccessor.incrementCallCount(DatasourceAccessor.java:220)

at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:479)

at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:452)

at oracle.toplink.essentials.internal.sessions.AbstractSession.executeCall(AbstractSession.java:690)

at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:228)

at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:214)

at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.executeNoSelectCall(DatasourceCallQueryMechanism.java:257)

at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.executeNoSelect(DatasourceCallQueryMechanism.java:237)

at oracle.toplink.essentials.queryframework.DataModifyQuery.executeDatabaseQuery(DataModifyQuery.java:86)

at oracle.toplink.essentials.queryframework.DatabaseQuery.execute(DatabaseQuery.java:628)

at oracle.toplink.essentials.internal.sessions.AbstractSession.internalExecuteQuery(AbstractSession.java:1834)

at oracle.toplink.essentials.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:952)

at oracle.toplink.essentials.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:924)

at oracle.toplink.essentials.sequencing.QuerySequence.update(QuerySequence.java:344)

at oracle.toplink.essentials.sequencing.QuerySequence.updateAndSelectSequence(QuerySequence.java:283)

at oracle.toplink.essentials.sequencing.StandardSequence.getGeneratedVector(StandardSequence.java:96)

at oracle.toplink.essentials.sequencing.DefaultSequence.getGeneratedVector(DefaultSequence.java:168)

at oracle.toplink.essentials.sequencing.Sequence.getGeneratedVector(Sequence.java:281)

at oracle.toplink.essentials.internal.sequencing.SequencingManager$Preallocation_Transaction_NoAccessor_State.getNextValue(SequencingManager.java:420)

at oracle.toplink.essentials.internal.sequencing.SequencingManager.getNextValue(SequencingManager.java:848)

at oracle.toplink.essentials.internal.sequencing.ClientSessionSequencing.getNextValue(ClientSessionSequencing.java:110)

at oracle.toplink.essentials.internal.descriptors.ObjectBuilder.assignSequenceNumber(ObjectBuilder.java:240)

at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.assignSequenceNumber(UnitOfWorkImpl.java:355)

at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.registerNotRegisteredNewObjectForPersist(UnitOfWorkImpl.java:3260)

at oracle.toplink.essentials.internal.ejb.cmp3.base.RepeatableWriteUnitOfWork.registerNotRegisteredNewObjectForPersist(RepeatableWriteUnitOfWork.java:339)

at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersist(UnitOfWorkImpl.java:3220)

at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl.persist(EntityManagerImpl.java:205)

at com.sun.enterprise.util.EntityManagerWrapper.persist(EntityManagerWrapper.java:238)

at com.business.DAO.GenericDAOImpl.save(GenericDAOImpl.java:62)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1067)

at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:176)

at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2895)

at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:3986)

at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:203)

at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:77)

at $Proxy60.save(Unknown Source)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)

at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)

at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)

at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)

at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)

at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)

at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)

at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)

at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)

at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)

at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)

Caused by: java.sql.SQLException: Error in allocating a connection. Cause: java.lang.IllegalStateException: cannot add non-XA Resource to global JTS transaction.

at com.sun.gjc.spi.base.DataSource.getConnection(DataSource.java:115)

at oracle.toplink.essentials.jndi.JNDIConnector.connect(JNDIConnector.java:145)

 60 more

javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean; nested exception is: Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b04-fcs (04/17/2008))): oracle.toplink.essentials.exceptions.DatabaseException

Internal Exception: java.sql.SQLException: Error in allocating a connection. Cause: java.lang.IllegalStateException: cannot add non-XA Resource to global JTS transaction.

Error Code: 0

Call: SQLCall(UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?)

Query: DataModifyQuery()

at com.sun.ejb.containers.BaseContainer.checkExceptionClientTx(BaseContainer.java:3728)

at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3576)

at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1354)

at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316)

at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:210)

at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:77)

at $Proxy60.save(Unknown Source)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)

at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)

at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)

at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)

at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)

at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)

at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)

at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)

at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)

at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)

at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
Abaixo segue a classe que utiliza a API UserTransaction:

public class Ejb3BusinessFactory extends BusinessFactory

{

private static Properties jndiProperties;

private static InitialContext initCtx;
private UserTransaction userTransaction;


@Override
public ClienteDAO getClienteDAO()
{
    try
    {
       initContext();
       String jndiName = jndiProperties.getProperty(JNDI_PROPERTY_CLIENTE_DAO);
       ClienteDAO dao = (ClienteDAO) initCtx.lookup(jndiName);
       return dao;
    }
    catch (NamingException e)
    {
      throw new RuntimeException(e);
    }
}

@Override
public BoletoDAO getBoletoDAO()
{
    try
    {
        initContext();
        String jndiName = jndiProperties.getProperty(JNDI_PROPERTY_BOLETO_DAO);
        BoletoDAO dao = (BoletoDAO) initCtx.lookup(jndiName);
        return dao;
    }
    catch (NamingException e)
    {
        throw new RuntimeException(e);
    }
}

@Override
public ContaDAO getContaDAO()
{
    try
    {
        initContext();
        String jndiName = jndiProperties.getProperty(JNDI_PROPERTY_CONTA_DAO);
        ContaDAO dao = (ContaDAO) initCtx.lookup(jndiName);
        return dao;
    }
    catch (NamingException e)
    {
        throw new RuntimeException(e);
    }

}

@Override
public ProdutoDAO getProdutoDAO()
{
    try
    {
        initContext();
        String jndiName = jndiProperties.getProperty(JNDI_PROPERTY_PRODUTO_DAO);
        ProdutoDAO dao = (ProdutoDAO) initCtx.lookup(jndiName);
        return dao;
    }
    catch (NamingException e)
    {
        throw new RuntimeException(e);
    }

}

@Override
public UsuarioDAO getUsuarioDAO()
{
    try
    {
        initContext();
        String jndiName = jndiProperties.getProperty(JNDI_PROPERTY_USUARIO_DAO);
        UsuarioDAO dao = (UsuarioDAO) initCtx.lookup(jndiName);
        return dao;
    }
    catch (NamingException e)
    {
        throw new RuntimeException(e);
    }
}

@Override
public VendaDAO getVendaDAO()
{
    try
    {
        initContext();
        String jndiName = jndiProperties.getProperty(JNDI_PROPERTY_VENDA_DAO);
        VendaDAO dao = (VendaDAO) initCtx.lookup(jndiName);
        return dao;
    }
    catch (NamingException e)
    {
        throw new RuntimeException(e);
    }

}

@Override
public ItemDAO getItemDAO()
{
    try
    {
        initContext();
        String jndiName = jndiProperties.getProperty(JNDI_PROPERTY_ITEM_DAO);
        ItemDAO dao = (ItemDAO) initCtx.lookup(jndiName);
        return dao;
    }
    catch (NamingException e)
    {
        throw new RuntimeException(e);
    }

}

@Override
public CorrecaoService getCorrecaoService()
{
    try
    {
        initContext();
        String jndiName = jndiProperties.getProperty(JNDI_PROPERTY_CORRECAO_SERVICE);
        CorrecaoService service = (CorrecaoService) initCtx.lookup(jndiName);
        return service;
    }
    catch (NamingException e)
    {
        throw new RuntimeException(e);
    }

}

@Override
public EstoqueService getEstoqueService()
{
    try
    {
        initContext();
        String jndiName = jndiProperties.getProperty(JNDI_PROPERTY_ESTOQUE_SERVICE);
        EstoqueService service = (EstoqueService) initCtx.lookup(jndiName);
        return service;
    }
    catch (NamingException e)
    {
        throw new RuntimeException(e);
    }

}

@Override
public VendaService getVendaService()
{
    try
    {
        initContext();
        String jndiName = jndiProperties.getProperty(JNDI_PROPERTY_VENDA_SERVICE);
        VendaService service = (VendaService) initCtx.lookup(jndiName);
        return service;
    }
    catch (NamingException e)
    {
        throw new RuntimeException(e);
    }
}

public static Properties getJndiProperties()
{
    return jndiProperties;
}

public static void setJndiProperties(Properties initCtxtProperties)
{
    Ejb3BusinessFactory.jndiProperties = initCtxtProperties;
}

public static void  setInitCtx(InitialContext initCtx) {
    Ejb3BusinessFactory.initCtx = initCtx;
}



@Override
public void rollback(boolean releaseResources)
{
    try
    {
        if (userTransaction != null)
        {
            if (userTransaction.getStatus() == Status.STATUS_ACTIVE)
            {
                userTransaction.rollback();
            }
            if (releaseResources)
            {
                this.userTransaction = null;
                this.initCtx.close();
                this.initCtx = null;
            }
        }
    }
    catch (Exception e)
    {
      throw new RuntimeException(e);
    }     
}

@Override
public void commit(boolean releaseResources)
{
   try
   {
      if (userTransaction != null)
      {
          if (userTransaction.getStatus() == Status.STATUS_ACTIVE)
          {
              userTransaction.commit();
          }
          if (releaseResources)
          {
              this.userTransaction = null;
              this.initCtx.close();
              this.initCtx = null;
          }
       }
    }
    catch (Exception e)
    {
       throw new RuntimeException(e);
    }
}

@Override
public void beginTransaction()
{
    try
    {
        initContext();
        if (userTransaction == null)
        {
            String jndiName = jndiProperties.getProperty(JNDI_PROPERTY_USER_TRANSACTION);
            userTransaction = (UserTransaction) initCtx.lookup(jndiName);
        }
        if (userTransaction.getStatus() == Status.STATUS_NO_TRANSACTION)
        {
            userTransaction.begin();
        }
    }
    catch (Exception e)
    {
        initCtx = null;
        throw new RuntimeException(e);
    }
}

private void initContext()
{
    try
    {
        if (this.initCtx == null)
        {
            initCtx = new InitialContext(jndiProperties);
        }
    }
    catch (Exception e)
    {
        initCtx = null;
        throw new RuntimeException(e);
    }
}

}

Agradeço desde já qualquer ajuda.

8 Respostas

GraveDigger

Poste aqui o arquivo de configuração de seu datasource no servidor.

Nunca trabalhei com o GlassFish, mas seria o equivalente a um *ds.xml do jboss.

Imagino que haja.hehe

[]'s

vinicius_jssouza

No glassFish utiliza-se um arquivo de configurações das resources do servidor. Segue abaixo esse arquivo:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Resource Definitions //EN" "http://www.sun.com/software/appserver/dtds/sun-resources_1_3.dtd">
<resources>
  <jdbc-resource enabled="true" jndi-name="jdbc/JCheckout" object-type="user" pool-name="JCheckoutPool">
    <description/>
  </jdbc-resource>
  <jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="JCheckoutPool" non-transactional-connections="false" pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false">
    <property name="URL" value="jdbc:mysql://localhost:3306/JCheckout"/>
    <property name="User" value="root"/>
    <property name="Password" value="griever"/>
  </jdbc-connection-pool>
</resources>
vinicius_jssouza

Uma outra questão: alguém saberia me dizer se, neste caso, é necessário utilizar um XAdatasource?

moacirjava
vinicius_jssouza:
No glassFish utiliza-se um arquivo de configurações das resources do servidor. Segue abaixo esse arquivo:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Resource Definitions //EN" "http://www.sun.com/software/appserver/dtds/sun-resources_1_3.dtd">
<resources>
  <jdbc-resource enabled="true" jndi-name="jdbc/JCheckout" object-type="user" pool-name="JCheckoutPool">
    <description/>
  </jdbc-resource>
  <jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="JCheckoutPool" non-transactional-connections="false" pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false">
    <property name="URL" value="jdbc:mysql://localhost:3306/JCheckout"/>
    <property name="User" value="root"/>
    <property name="Password" value="griever"/>
  </jdbc-connection-pool>
</resources>

Esse arquivo é o responsável por conectar o aplicativo desktop com o ejb?
Onde ele se localiza?

Há um tempo atrás eu tentei fazer um pequeno exemplo de uma aplicação desktop conectar com um ejb, mas não obtive êxito.

vinicius_jssouza

Não… esse arquivo é o arquivo de configuração do datasource do banco de dados mysql para o glassFish. Não utilizei arquivos de configuração para ejbs…usei apenas annotations mesmo.

thimor

Nao tenho total certeza se vai ser isso. Mas quando voce tirou o controle de transacoes do container voce trocou no persistence.xml o transation-type de “JTA” para “RESOURCE_LOCAL” ?

vinicius_jssouza

Na verdade eu quero continuar utilizando a JTA… o que eu estou fazendo é utilizar a UserTransaction para demarcar as transações através do cliente swing (begin, commit, rollback…). Esta classe mantem a JTA, porem possibilita a demarcação manual das transações, enquanto, em outros casos, o conteiner faz essa demarcação.

vinicius_jssouza

Pessoal, consegui resolver o meu problema… acabei trocando o glassFish pelo JBoss e tudo funcionou perfeitamente. Tentei entrar em contato com a comunidade do glassfish mas ninguém soube responder minha dúvida… parece ser mesmo um bug do glassFish.

Criado 30 de dezembro de 2008
Ultima resposta 2 de jan. de 2009
Respostas 8
Participantes 4