Hi Philipp,

thanks for your help. When debugging I can see that the 
C3p0XAPooledDataSourceFactory is already used, it only uses the parent logger 
so the log entry is a little bit confusing. It gets a OracleXADatasource which 
implements XADataSource. So I suppose the problem is more related to either 
hibernate (currently I can't see that the hibernate C3P0ConnectionProvider gets 
used) or the Aries TransactionManager.

Cheers,
Christian

________________________________
Von: Philipp Marx <smi...@googlemail.com>
Gesendet: Dienstag, 17. März 2020 09:55:15
An: user@aries.apache.org
Betreff: Re: Transaction problem in Karaf when switching from dbcp2 connection 
pool to c3p0

Checking pax-jdbc, it seems you can switch to 
https://github.com/ops4j/org.ops4j.pax.jdbc/blob/master/pax-jdbc-pool-c3p0/src/main/java/org/ops4j/pax/jdbc/pool/c3p0/impl/ds/C3p0XAPooledDataSourceFactory.java
[https://avatars3.githubusercontent.com/u/223072?s=400&v=4]<https://github.com/ops4j/org.ops4j.pax.jdbc/blob/master/pax-jdbc-pool-c3p0/src/main/java/org/ops4j/pax/jdbc/pool/c3p0/impl/ds/C3p0XAPooledDataSourceFactory.java>

org.ops4j.pax.jdbc/C3p0XAPooledDataSourceFactory.java at master · 
ops4j/org.ops4j.pax.jdbc · 
GitHub<https://github.com/ops4j/org.ops4j.pax.jdbc/blob/master/pax-jdbc-pool-c3p0/src/main/java/org/ops4j/pax/jdbc/pool/c3p0/impl/ds/C3p0XAPooledDataSourceFactory.java>
github.com
An OSGi JDBC Service Implementation, including adapters for various database 
drivers - ops4j/org.ops4j.pax.jdbc


Am Di., 17. März 2020 um 09:48 Uhr schrieb Philipp Marx 
<smi...@googlemail.com<mailto:smi...@googlemail.com>>:
Hi Christian,

I had the same problem. What you need to ensure is to use a ConnectionPool 
which does support XAConnections / XADataSources.It is important that the 
interface of the Connection Pool datasource implements XADataSource. The only 
pool I have found which does support this is commons DBCP2 
(https://commons.apache.org/proper/commons-dbcp/api-2.1.1/org/apache/commons/dbcp2/managed/BasicManagedDataSource.html).
 If I didn't use one of these I could observe the exact behaviour you are 
describing. Note: It doesn't matter that the physical connection from your 
driver is XA enabled, since the TransactionManager usually retrieves a 
"wrapped" DataSource from the pool, and if this doesn't implement the 
XADataSource interface it won't be registered into the current transaction.

Let me know if this helps.

Cheers,
Philipp

Am Do., 12. März 2020 um 16:11 Uhr schrieb Niehues, Christian 
<christian.nieh...@its-digital.de<mailto:christian.nieh...@its-digital.de>>:

Hi,


I still have problem with this setup, maybe anyone has a hint how to fix the 
transaction problem or how to use this KeepXAConnTillTxComplete property in a 
persistence.xml?


Thanks in advice,

Christian

________________________________
Von: Niehues, Christian 
<christian.nieh...@its-digital.de<mailto:christian.nieh...@its-digital.de>>
Gesendet: Dienstag, 23. Juli 2019 09:48:55
An: user@aries.apache.org<mailto:user@aries.apache.org>
Betreff: AW: Transaction problem in Karaf when switching from dbcp2 connection 
pool to c3p0


Yes I use pax-jdbc for it and I can see that the C3p0PooledDatasourceFactory  
creates the datasource.


This is what the datasource.cfg looks like:


osgi.jdbc.driver.name<http://osgi.jdbc.driver.name>=oracle
url=jdbc:oracle:thin:@localhost:1521:XE
user=pra_user
password=pra_user
databaseName=PRA
dataSourceName=PRA
pool=c3p0
xa=true
c3p0.acquireRetryDelay=1000
c3p0.numHelperThreads=4
c3p0.maxPoolSize=25
c3p0.acquireRetryAttempts=5
c3p0.acquireIncrement=1



Only things that are irretating me is that it seems the datasource is created 
twice and that I also get some warnings:


2019-07-23T09:25:26,574 | INFO  | FelixStartLevel  | TransactionManager         
      | 60 - org.ops4j.pax.jdbc.pool.common - 1.2.1 | TransactionManager 
service detected. Providing support for XA DataSourceFactories
2019-07-23T09:25:26,585 | INFO  | FelixStartLevel  | ServiceTrackerHelper       
      | 59 - org.ops4j.pax.jdbc.config - 1.2.1 | Obtained service dependency: 
(&(objectClass=org.ops4j.pax.jdbc.pool.common.PooledDataSourceFactory)(pool=c3p0)(xa=true))
2019-07-23T09:25:26,589 | INFO  | FelixStartLevel  | ServiceTrackerHelper       
      | 59 - org.ops4j.pax.jdbc.config - 1.2.1 | Obtained service dependency: 
(&(objectClass=org.osgi.service.jdbc.DataSourceFactory)(osgi.jdbc.driver.name<http://osgi.jdbc.driver.name>=oracle))
2019-07-23T09:25:26,591 | INFO  | FelixStartLevel  | DataSourceRegistration     
      | 59 - org.ops4j.pax.jdbc.config - 1.2.1 | Found DataSourceFactory. 
Creating DataSource PRA
2019-07-23T09:25:26,592 | ERROR | FelixStartLevel  | 
C3p0PooledDataSourceFactory      | 326 - org.ops4j.pax.jdbc.pool.c3p0 - 1.2.1 | 
Please define c3p0.dataSourceName in your configuration to prevent memory leaks
2019-07-23T09:25:26,642 | INFO  | MLog-Init-Reporter | MLog                     
        | 198 - org.apache.servicemix.bundles.c3p0 - 0.9.5.2_1 | MLog clients 
using slf4j logging.
2019-07-23T09:25:26,698 | WARN  | FelixStartLevel  | BeansUtils                 
      | 198 - org.apache.servicemix.bundles.c3p0 - 0.9.5.2_1 | Property 
inaccessible for overwriting: password
2019-07-23T09:25:26,703 | WARN  | FelixStartLevel  | BeansUtils                 
      | 198 - org.apache.servicemix.bundles.c3p0 - 0.9.5.2_1 | Property 
inaccessible for overwriting: user
2019-07-23T09:25:26,707 | INFO  | FelixStartLevel  | C3P0Registry               
      | 198 - org.apache.servicemix.bundles.c3p0 - 0.9.5.2_1 | Initializing 
c3p0-0.9.5.2 [built 08-December-2015 22:06:04 -0800; debug? true; trace: 10]
2019-07-23T09:25:26,798 | INFO  | FelixStartLevel  | ServiceTrackerHelper       
      | 59 - org.ops4j.pax.jdbc.config - 1.2.1 | Obtained service dependency: 
(&(objectClass=org.ops4j.pax.jdbc.pool.common.PooledDataSourceFactory)(pool=c3p0)(xa=true))
2019-07-23T09:25:26,800 | INFO  | FelixStartLevel  | ServiceTrackerHelper       
      | 59 - org.ops4j.pax.jdbc.config - 1.2.1 | Obtained service dependency: 
(&(objectClass=org.osgi.service.jdbc.DataSourceFactory)(osgi.jdbc.driver.name<http://osgi.jdbc.driver.name>=oracle))
2019-07-23T09:25:26,801 | INFO  | FelixStartLevel  | DataSourceRegistration     
      | 59 - org.ops4j.pax.jdbc.config - 1.2.1 | Found DataSourceFactory. 
Creating DataSource PRA
2019-07-23T09:25:26,802 | ERROR | FelixStartLevel  | 
C3p0PooledDataSourceFactory      | 326 - org.ops4j.pax.jdbc.pool.c3p0 - 1.2.1 | 
Please define c3p0.dataSourceName in your configuration to prevent memory leaks
2019-07-23T09:25:26,822 | WARN  | FelixStartLevel  | BeansUtils                 
      | 198 - org.apache.servicemix.bundles.c3p0 - 0.9.5.2_1 | Property 
inaccessible for overwriting: password
2019-07-23T09:25:26,823 | WARN  | FelixStartLevel  | BeansUtils                 
      | 198 - org.apache.servicemix.bundles.c3p0 - 0.9.5.2_1 | Property 
inaccessible for overwriting: user


The persistenceUnit for access to the EntityManager is defined in a 
persistence.xml:


<persistence-unit name="pra" transaction-type="JTA">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name<http://osgi.jndi.service.name>=PRA)</jta-data-source>
<properties>
<property name="hibernate.connection.driver_class" 
value="oracle.jdbc.OracleDriver" />
<property name="hibernate.dialect" 
value="org.hibernate.dialect.Oracle10gDialect" />
<property name="hibernate.archive.autodetection" value="class"/>
<property name="hibernate.enable_lazy_load_no_trans" value="true"/>
<property name="hibernate.connection.isolation" value="4"/>
<property name="hibernate.connection.autocommit" value="false"/>
</properties>
</persistence-unit>

Maybe there is something wrong with that?
I noticed some examples using 
hibernate.connection.driver_class=oracle.jdbc.xa.client.OracleXADataSource and 
KeepXAConnTillTxComplete=true
but never as part of a persistence.xml



Christian

________________________________
Von: Christian Schneider 
<ch...@die-schneider.net<mailto:ch...@die-schneider.net>>
Gesendet: Dienstag, 23. Juli 2019 08:59:36
An: user@aries.apache.org<mailto:user@aries.apache.org>
Betreff: Re: Transaction problem in Karaf when switching from dbcp2 connection 
pool to c3p0

How do you setup the data source? You need to provide a DataSource that wraps a 
XADataSource and does auto enlistment. Do you use pax-jdbc for this?

Christian

Am Mo., 22. Juli 2019 um 15:52 Uhr schrieb Niehues, Christian 
<christian.nieh...@its-digital.de<mailto:christian.nieh...@its-digital.de>>:

Hello,


I have deployed an application in my Karaf 4.1.5 using JMS, Camel, Hibernate, 
Aries Transaction Manager and PAX JDBC Pool.


Everything works fine except when I process parallel requests where I sometimes 
get a SQLException from dbcp class ManagedConnection reporting "Connection can 
not be used while enlisted in another transaction" and the request fails.

After some analyses I came to the assumption that it is maybe related to the 
fact that Hibernate doesn't support a ConnectionProvider for dbcp.


So I switch the connection pool to c3p0 which is supported by Hibernate. But 
here I face another problem just for a single request: some DB operations get 
executed before the transaction commits so I am also unable to rollback 
everything on exception. It seems that all flushes initiated by Hibernate 
directly go into the DB.


So I assume that anything with the transaction synchronisation/coordination is 
wrong. The transactional context is defined by a @Transactional annotation. 
From debugging I can see that the AriesPlatformTransactionManager and the 
C3p0PooledDatasourceFactory is involved. Do you have any hint what could cause 
this problem or how can I can I do more depth analyses?


Thanks in advice,

Christian


--
--
Christian Schneider
http://www.liquid-reality.de

Computer Scientist
http://www.adobe.com

Reply via email to