You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@aries.apache.org by Mariusz Ćwikła <ma...@gmail.com> on 2013/07/29 12:38:48 UTC

JTA+JPA: Unable to enlist XAResource oracle.jdbc.driver.T4CXAResource

Hello,
I have an issue regarding JTA+JPA in Apache Aries. I use OpenJPA and Oracle
driver.
My first problem was that when I had a method marked as Required and a
RuntimeException was thrown then transaction was not rolled back.

My configuration was like this:
<bean id="oracleXADataSource"
class="oracle.jdbc.xa.client.OracleXADataSource">
  ...
</bean>

<service ref="oracleXADataSource" interface="javax.sql.DataSource">
<service-properties>
<entry key="osgi.jndi.service.name" value="jdbc/myDS" />
</service-properties>
</service>

persistence.xml:

<persistence-unit name="applicationPU" transaction-type="JTA">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name
=jdbc/myDS)</jta-data-source>
...
</persistence-unit>

Here is a list of aries bundles in my runtime:
43 ACTIVE      org.apache.aries.blueprint_1.0.0
44 ACTIVE      org.apache.aries.util_1.0.0
53 ACTIVE      org.apache.aries.proxy_1.0.0
60 ACTIVE      org.apache.aries.jndi_1.0.0
66 ACTIVE      org.apache.aries.jpa.blueprint.aries_1.0.0
87 ACTIVE      org.apache.aries.jpa.api_1.0.0
105 ACTIVE      org.apache.aries.transaction.manager_1.0.0
108 ACTIVE      org.apache.aries.jpa.container.context_1.0.0
116 ACTIVE      org.apache.aries.transaction.blueprint_1.0.0
145 ACTIVE      org.apache.aries.jpa.container_1.0.0

I figured out that the problem was caused by using non-XA datasource and
not using XA-enlisting Aries bundle
org.apache.aries.transaction.wrappers_1.0.0

Here is what I have done:
1. export XADataSource instead of DataSource
<service ref="oracleXADataSource" interface="javax.sql.XADataSource">
<service-properties>
<entry key="osgi.jndi.service.name" value="jdbc/myDS" />
</service-properties>
</service>
2. Added org.apache.aries.transaction.wrappers_1.0.0 to my runtime
3. in persistence.xml changed DataSource to XADataSource:
<jta-data-source>osgi:service/javax.sql.XADataSource/(osgi.jndi.service.name
=jdbc/myDS)</jta-data-source>


My first question is: is this correct, or have I something wrong or missing?

Right now I have another issue - oracle driver is throwing SQLException:
ORA-25351
My application looks like this:
I have following bundles (I tried to simplify the whole example):
1. oracle.datasource -> uses blueprint.xml to register XADataSource
2. I have three business-logic bundles, each having it's own Persistence
Unit:
bundleA -> aPU
bundleB -> bPU
bundleC -> cPU
clientBundle - client bundle, not having PU
In bundleA there is a following method:
public class MyBean implements ...{
IMyDAO dao; //1
public void saveState(IConfiguration [] configuration){ //2
 MyEntity e = dao.create(...); //3
for(IConfiguration config: configuration){
config.persist(e.getId()); //4
 }
}
}

1. dao is injected by blueprint, dao has EntityManager injected (aPU)
2. saveState is marked as Required
3. create is marked as Required
4. IConfiguration is an interface. Let's say, that it's implementations
come from bundleB and bundleC. These are simple java objects, but inside
persist() method they call some other beans that also have dao's and use
EntityManager (one uses bPU, other uses cPU)
 The error I get is thrown in persist. Stacktrace is like this:

SEVERE: 5B3DBEE4 Throwing SQLException: ORA-25351:
25351
2013-07-29 10:55:47 oracle.jdbc.xa.OracleXAResource checkError
SEVERE: 51B53AF Throwing XAException: 25351
Unable to enlist XAResource oracle.jdbc.driver.T4CXAResource@51b53af,
errorCode: 4
oracle.jdbc.xa.OracleXAException: null
at oracle.jdbc.xa.OracleXAResource.checkError(OracleXAResource.java:2286)
~[na:na]
at oracle.jdbc.xa.client.OracleXAResource.start(OracleXAResource.java:407)
~[na:na]
at
org.apache.geronimo.transaction.manager.TransactionImpl.enlistResource(TransactionImpl.java:195)
~[na:na]
at
org.apache.aries.jpa.container.tx.impl.XADatasourceEnlistingWrapper.enlist(XADatasourceEnlistingWrapper.java:109)
[org.apache.aries.jpa.container-1.0.0.jar:1.0.0]
at
org.apache.aries.jpa.container.tx.impl.XADatasourceEnlistingWrapper.getConnection(XADatasourceEnlistingWrapper.java:72)
[org.apache.aries.jpa.container-1.0.0.jar:1.0.0]
at
org.apache.aries.jpa.container.unit.impl.DelayedLookupDataSource.getConnection(DelayedLookupDataSource.java:36)
[org.apache.aries.jpa.container-1.0.0.jar:1.0.0]
at
org.apache.openjpa.lib.jdbc.DelegatingDataSource.getConnection(DelegatingDataSource.java:110)
[openjpa-2.2.0.jar:2.2.0]
at
org.apache.openjpa.lib.jdbc.DecoratingDataSource.getConnection(DecoratingDataSource.java:87)
[openjpa-2.2.0.jar:2.2.0]
at
org.apache.openjpa.jdbc.sql.DBDictionaryFactory.newDBDictionary(DBDictionaryFactory.java:91)
[openjpa-2.2.0.jar:2.2.0]
at
org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.getDBDictionaryInstance(JDBCConfigurationImpl.java:603)
[openjpa-2.2.0.jar:2.2.0]
at
org.apache.openjpa.jdbc.meta.MappingRepository.endConfiguration(MappingRepository.java:1510)
[openjpa-2.2.0.jar:2.2.0]
at
org.apache.openjpa.lib.conf.Configurations.configureInstance(Configurations.java:518)
[openjpa-2.2.0.jar:2.2.0]
at
org.apache.openjpa.lib.conf.Configurations.configureInstance(Configurations.java:443)
[openjpa-2.2.0.jar:2.2.0]
at
org.apache.openjpa.lib.conf.PluginValue.instantiate(PluginValue.java:104)
[openjpa-2.2.0.jar:2.2.0]
at
org.apache.openjpa.conf.MetaDataRepositoryValue.instantiate(MetaDataRepositoryValue.java:68)
[openjpa-2.2.0.jar:2.2.0]
at org.apache.openjpa.lib.conf.ObjectValue.instantiate(ObjectValue.java:83)
[openjpa-2.2.0.jar:2.2.0]
at
org.apache.openjpa.conf.OpenJPAConfigurationImpl.newMetaDataRepositoryInstance(OpenJPAConfigurationImpl.java:968)
[openjpa-2.2.0.jar:2.2.0]
at
org.apache.openjpa.conf.OpenJPAConfigurationImpl.getMetaDataRepositoryInstance(OpenJPAConfigurationImpl.java:959)
[openjpa-2.2.0.jar:2.2.0]
at
org.apache.openjpa.kernel.AbstractBrokerFactory.makeReadOnly(AbstractBrokerFactory.java:638)
[openjpa-2.2.0.jar:2.2.0]
at
org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:203)
[openjpa-2.2.0.jar:2.2.0]
at
org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:156)
[openjpa-2.2.0.jar:2.2.0]
at
org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:227)
[openjpa-2.2.0.jar:2.2.0]
at
org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:60)
[openjpa-2.2.0.jar:2.2.0]
at
org.apache.aries.jpa.container.impl.CountingEntityManagerFactory.createEntityManager(CountingEntityManagerFactory.java:71)
[org.apache.aries.jpa.container-1.0.0.jar:1.0.0]
at
org.apache.aries.jpa.container.context.transaction.impl.JTAPersistenceContextRegistry.getCurrentPersistenceContext(JTAPersistenceContextRegistry.java:152)
[org.apache.aries.jpa.container.context-1.0.0.jar:1.0.0]
at
org.apache.aries.jpa.container.context.transaction.impl.JTAEntityManager.getPersistenceContext(JTAEntityManager.java:84)
[org.apache.aries.jpa.container.context-1.0.0.jar:1.0.0]
at
org.apache.aries.jpa.container.context.transaction.impl.JTAEntityManager.persist(JTAEntityManager.java:278)
[org.apache.aries.jpa.container.context-1.0.0.jar:1.0.0]
at mybundleB.MyConfigurationBDAO.save(...) ...
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
~[na:1.6.0_41]
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
~[na:1.6.0_41]
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
~[na:1.6.0_41]
at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_41]
at org.apache.aries.proxy.impl.ProxyHandler$1.invoke(ProxyHandler.java:54)
[org.apache.aries.proxy-1.0.0.jar:1.0.0]
at org.apache.aries.proxy.impl.ProxyHandler.invoke(ProxyHandler.java:119)
[org.apache.aries.proxy-1.0.0.jar:1.0.0]
at com.sun.proxy.$Proxy14.save(Unknown Source) [na:na]
at myBundleB.MyConfigurationB.persist(...) ....
at myBudnleA.MyBean.saveState(...) ....
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
~[na:1.6.0_41]
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
~[na:1.6.0_41]
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
~[na:1.6.0_41]
at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_41]
at org.apache.aries.proxy.impl.ProxyHandler$1.invoke(ProxyHandler.java:54)
[org.apache.aries.proxy-1.0.0.jar:1.0.0]
at org.apache.aries.proxy.impl.ProxyHandler.invoke(ProxyHandler.java:119)
[org.apache.aries.proxy-1.0.0.jar:1.0.0]
at myClient.MyClient.saveState(...) ...
......