Closed sinattieng closed 3 weeks ago
Hey! @sinattieng
You might want to check out this Use multiple datasources in a single transaction which covers the need for XA support when using multiple JDBC data sources. Make sure your JDBC driver supports XA (most should) and that your database server is configured for it.
For Oracle, you can try using the XA driver "oracle.jdbc.xa.client.OracleXADataSource". It could help resolve the issue you're facing.
If anyone else has more insights or experience with this, feel free to chime in! Hope this helps!
/cc @gsmet (hibernate-orm), @yrodiere (hibernate-orm)
Hey,
Indeed, if multiple datasources are involved in the same transaction, you must use XA transactions; doing otherwise may result in non-transactional behavior.
Quarkus 3.8 and below was lenient, but 3.9+ fails so that you know something is wrong.
You can find documentation about this here: https://quarkus.io/guides/datasource#datasource-multiple-single-transaction
I thought we had added something to migration guides, but I can't find anything... I will add something.
I thought we had added something to migration guides, but I can't find anything... I will add something.
I added this: https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.9#multiple-datasources-single-transaction
Since this error is expected, and documentation includes ways to avoid it, I will close this issue. Feel free to comment if you think there is still something to be done in Quarkus.
Thank you very much for the support. Enabling XA datasources (both are oracle) I have resolved my issues BUT during boot I have this log:
2024-09-24 12:38:09,983 ; WARN ; [io.quarkus.agroal.runtime.DataSources] ; (JPA Startup Thread: sacer) ; ; Datasource sacer enables XA but transaction recovery is not enabled. Please enable transaction recovery by setting quarkus.transaction-manager.enable-recovery=true, otherwise data may be lost if the application is terminated abruptly
so I have to add the enable-recovery (setted true) configuration and everything is ok BUT now I'm facing this warning
2024-09-24 12:41:13,473 ; WARN ; [com.arjuna.ats.jta] ; (Periodic Recovery) ; ; XAException: : javax.transaction.xa.XAException\n at oracle.jdbc.xa.OracleXAResource.recover(OracleXAResource.java:764)\n at io.agroal.narayana.RecoveryXAResource.lambda$recover$0(RecoveryXAResource.java:56)\n at io.agroal.narayana.RecoveryXAResource.getConnectedResource(RecoveryXAResource.java:40)\n at io.agroal.narayana.RecoveryXAResource.recover(RecoveryXAResource.java:56)\n at com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule.xaRecoveryFirstPass(XARecoveryModule.java:700)\n at com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule.periodicWorkFirstPass(XARecoveryModule.java:225)\n at com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule.periodicWorkFirstPass(XARecoveryModule.java:167)\n at com.arjuna.ats.internal.arjuna.recovery.PeriodicRecovery.doWorkInternal(PeriodicRecovery.java:743)\n at com.arjuna.ats.internal.arjuna.recovery.PeriodicRecovery.run(PeriodicRecovery.java:355)\n
so I have to add the enable-recovery (setted true) configuration and everything is ok BUT now I'm facing this warning
2024-09-24 12:41:13,473 ; WARN ; [com.arjuna.ats.jta] ; (Periodic Recovery) ; ; XAException: : javax.transaction.xa.XAException\n at oracle.jdbc.xa.OracleXAResource.recover(OracleXAResource.java:764)\n at io.agroal.narayana.RecoveryXAResource.lambda$recover$0(RecoveryXAResource.java:56)\n at io.agroal.narayana.RecoveryXAResource.getConnectedResource(RecoveryXAResource.java:40)\n at io.agroal.narayana.RecoveryXAResource.recover(RecoveryXAResource.java:56)\n at com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule.xaRecoveryFirstPass(XARecoveryModule.java:700)\n at com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule.periodicWorkFirstPass(XARecoveryModule.java:225)\n at com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule.periodicWorkFirstPass(XARecoveryModule.java:167)\n at com.arjuna.ats.internal.arjuna.recovery.PeriodicRecovery.doWorkInternal(PeriodicRecovery.java:743)\n at com.arjuna.ats.internal.arjuna.recovery.PeriodicRecovery.run(PeriodicRecovery.java:355)\n
This is new to me. Did you sanitize the message, remove any information? There isn't much to work with... As things are, I don't see how you could guess what to do; I think the warning should at least state what failed exactly.
I'd suggest opening a dedicated issue? A reproducer would be nice, but even without that, the stack trace should enable Narayana (transaction layer) maintainers to spot the place where this is logged and to ensure a more meaningful/actionable message is inserted.
Describe the bug
Starting from quarkus version 3.12.1 my current configuration of multiple datasources not work anymore, indeed on application log I catch this exception :
My application totally works with the same application.yml until version 3.2.3.Final, below part of my configuration:
Note: ${SACER_JDBC_URL}, ${SACER_USERNAME}, ${SACER_PASSWORD} defined as env variables
In addition I have those properties for dev profile
application starts withouth warning or error but when business logic try to execute any query via "sacer" datasource fails, below an example of PersistenceUnit on code:
Systematically i catch the exeption trying to execute any query (note. in the same transaction i could have multiple JDBC connection with my persistene units). I tried with the latest 3.8.x version and it work BUT if I try to update on 3.12.x doesn't work, same with 3.14.x.
So, in conclusion:
Thank you very much for your support.
Stefano Sinatti
Expected behavior
No response
Actual behavior
No response
How to Reproduce?
No response
Output of
uname -a
orver
No response
Output of
java -version
No response
Quarkus version or git rev
No response
Build tool (ie. output of
mvnw --version
orgradlew --version
)No response
Additional information
No response