tomee-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Shawn Jiang <genspr...@gmail.com>
Subject Re: IBM JDK + HSQLDB + OpenEJB - problems with entity manager: Connection does not have a registered XAResource
Date Mon, 01 Aug 2011 12:54:57 GMT
I met the same problem when running embeded ejb  with geronimo
3.0-snapshot.    After some debug,  I found that the exception was thrown
from this class.

org.apache.commons.dbcp.managed.TransactionRegistry

{

    private final Map *xaResources *= new WeakHashMap();

...
 public synchronized XAResource getXAResource(Connection connection) throws
SQLException {
        if (connection == null) throw new NullPointerException("connection
is null");
        XAResource xaResource = (XAResource) *xaResources*.get(connection);
        if (xaResource == null) {
            throw new SQLException("Connection does not have a registered
XAResource " + connection);
        }
        return xaResource;
    }

...
}

The XAResource was registered with connection as key.    the method
getXAResource is used to fetch the corresponding XAResrouce later.   a
wrappered connecion was passed and in Oracle JDK.  the
xaResource.get(connection)  could get the xaResource out.

But for IBM JDK, the xaResources.get(connection) will return null.     And
then result in the SQLException.     I believe it's caused by the
WeakHashMap implementation difference between Oracle JDK and IBM JDK.


I changed

private final Map *xaResources *= new WeakHashMap();

to

private final Map *xaResources *= new HashMap();

and it works for me.   I guess the HashMap.get()   behavior of both JDK are
the same.     Hope it helps.

On Wed, Mar 23, 2011 at 7:25 PM, anenvyguest2 <lordxxx@fastmail.fm> wrote:

> Hi,
> I'm using IBM JDK (1.6) and having troubles running OpenEJB "injection of
> entity manager" example.
> So, I have downloaded examples, changed to "injection-of-entitymanager"
> directory and ran Maven.
>
> Here is the exception I've got:
>
>
> INFO - Created Ejb(deployment-id=Movies, ejb-name=Movies, container=Default
> Stateful Container)
> INFO - Deployed Application(path=classpath.ear)
> WARN - Unexpected exception from beforeCompletion; transaction will roll
> back
>  org.apache.openjpa.persistence.PersistenceException: Connection does not
> have a registered XAResource
>  jdbc:hsqldb:mem:moviedb, UserName=SA, HSQL Database Engine Driver
>        at
> org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4232)
>        at
>
> org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4197)
>        at
>
> org.apache.openjpa.jdbc.sql.HSQLDictionary.newStoreException(HSQLDictionary.java:292)
>        at
> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:102)
>        at
> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:88)
>        at
> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:64)
>        at
>
> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.connect(JDBCStoreManager.java:930)
>        at
>
> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.retainConnection(JDBCStoreManager.java:216)
>        at
>
> org.apache.openjpa.kernel.DelegatingStoreManager.retainConnection(DelegatingStoreManager.java:163)
>        at
> org.apache.openjpa.kernel.BrokerImpl.retainConnection(BrokerImpl.java:3710)
>        at
>
> org.apache.openjpa.kernel.BrokerImpl.beginStoreManagerTransaction(BrokerImpl.java:1283)
>        at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1968)
>        at
> org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:1908)
>        at
> org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:1826)
>        at
>
> org.apache.geronimo.transaction.manager.TransactionImpl.beforeCompletion(TransactionImpl.java:514)
>        at
>
> org.apache.geronimo.transaction.manager.TransactionImpl.beforeCompletion(TransactionImpl.java:499)
>        at
>
> org.apache.geronimo.transaction.manager.TransactionImpl.beforePrepare(TransactionImpl.java:400)
>        at
>
> org.apache.geronimo.transaction.manager.TransactionImpl.commit(TransactionImpl.java:257)
>        at
>
> org.apache.geronimo.transaction.manager.TransactionManagerImpl.commit(TransactionManagerImpl.java:245)
>        at
>
> org.apache.openejb.core.transaction.JtaTransactionPolicy.completeTransaction(JtaTransactionPolicy.java:291)
>        at
> org.apache.openejb.core.transaction.TxRequired.commit(TxRequired.java:75)
>        at
>
> org.apache.openejb.core.transaction.EjbTransactionUtil.afterInvoke(EjbTransactionUtil.java:74)
>        at
>
> org.apache.openejb.core.stateful.StatefulContainer.afterInvoke(StatefulContainer.java:799)
>        at
>
> org.apache.openejb.core.stateful.StatefulContainer.businessMethod(StatefulContainer.java:567)
>        at
>
> org.apache.openejb.core.stateful.StatefulContainer.invoke(StatefulContainer.java:325)
>        at
>
> org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod(EjbObjectProxyHandler.java:217)
>        at
>
> org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectProxyHandler.java:77)
>        at
>
> org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:282)
>        at $Proxy26.addMovie(Unknown Source)
>        at org.superbiz.injection.jpa.MoviesTest.test(MoviesTest.java:45)
>        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>        at
>
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
>        at
>
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
>        at java.lang.reflect.Method.invoke(Method.java:611)
>        at junit.framework.TestCase.runTest(TestCase.java:164)
>        at junit.framework.TestCase.runBare(TestCase.java:130)
>        at junit.framework.TestResult$1.protect(TestResult.java:110)
>        at junit.framework.TestResult.runProtected(TestResult.java:128)
>        at junit.framework.TestResult.run(TestResult.java:113)
>        at junit.framework.TestCase.run(TestCase.java:120)
>        at junit.framework.TestSuite.runTest(TestSuite.java:228)
>        at junit.framework.TestSuite.run(TestSuite.java:223)
>        at
>
> org.junit.internal.runners.OldTestClassRunner.run(OldTestClassRunner.java:35)
>        at
>
> org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:35)
>        at
>
> org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:115)
>        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>        at
>
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
>        at
>
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
>        at java.lang.reflect.Method.invoke(Method.java:611)
>        at
>
> org.apache.maven.surefire.booter.ProviderFactory$ClassLoaderProxy.invoke(ProviderFactory.java:103)
>        at $Proxy0.invoke(Unknown Source)
>        at
>
> org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:150)
>        at
>
> org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:91)
>        at
> org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69)
> Caused by:
> java.sql.SQLException: Connection does not have a registered XAResource
> jdbc:hsqldb:mem:moviedb, UserName=SA, HSQL Database Engine Driver
>        at
>
> org.apache.commons.dbcp.managed.TransactionRegistry.getXAResource(TransactionRegistry.java:76)
>        at
>
> org.apache.commons.dbcp.managed.TransactionContext.setSharedConnection(TransactionContext.java:88)
>        at
>
> org.apache.commons.dbcp.managed.ManagedConnection.updateTransactionStatus(ManagedConnection.java:131)
>        at
>
> org.apache.commons.dbcp.managed.ManagedConnection.(ManagedConnection.java:55)
>        at
>
> org.apache.commons.dbcp.managed.ManagedDataSource.getConnection(ManagedDataSource.java:77)
>        at
>
> org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:884)
>        at
>
> org.apache.openjpa.lib.jdbc.DelegatingDataSource.getConnection(DelegatingDataSource.java:106)
>        at
>
> org.apache.openjpa.lib.jdbc.DecoratingDataSource.getConnection(DecoratingDataSource.java:87)
>        at
>
> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.connectInternal(JDBCStoreManager.java:941)
>        at
>
> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.connect(JDBCStoreManager.java:926)
>        ... 48 more
> Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 5.708 sec
> <<< FAILURE!
>
>
>
> I don't have such troubles when using Oracle JDK (1.6.24)
> Any idea how to fix this? Changing JDK is not an option in my case.
> Thank you!
>
> --
> View this message in context:
> http://openejb.979440.n4.nabble.com/IBM-JDK-HSQLDB-OpenEJB-problems-with-entity-manager-Connection-does-not-have-a-registered-XAResource-tp3399239p3399239.html
> Sent from the OpenEJB User mailing list archive at Nabble.com.
>



-- 
Shawn

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message