При использовании Arjuna (JBoss) TransactionManager и получении соединения с DriverManager.getConnection (...) одно и то же соединение получается в разных потоках и генерируется исключение.
String dsJndiTestDb = TransactionalDriver.arjunaDriver + dataSourceName;
conn = DriverManager.getConnection(dsJndiTestDb, new Properties());
Журнал показываетчто соединение имеет тип com.arjuna.ats.internal.jdbc.ConnectionImple@719fdd2f
Однако, если другой поток работает параллельно, предоставляется то же соединение, и приложение выдает исключение.
Caused by: com.monoplus.mcd.exception.ApplicationException: ConnectionImple.registerDatabase - ARJUNA017017: enlist of resource failed
at com.monoplus.mcd.sql.DbQueryRepository.sqlQueryForPreparedStatement(DbQueryRepository.java:182)
at com.monoplus.mcd.sql.DbQueryRepository.executeSelectStatement(DbQueryRepository.java:77)
... 68 more
Caused by: java.sql.SQLException: ConnectionImple.registerDatabase - ARJUNA017017: enlist of resource failed
at com.arjuna.ats.internal.jdbc.ConnectionImple.registerDatabase(ConnectionImple.java:961)
at com.arjuna.ats.internal.jdbc.ConnectionImple.prepareStatement(ConnectionImple.java:173)
at com.monoplus.mcd.sql.DbQueryRepository.sqlQueryForPreparedStatement(DbQueryRepository.java:144)
... 69 more
Теперь, если вместо этого я использую следующее для получения соединения:
XADataSource ds = InitialContext.doLookup("java:/comp/env/jdbc/" + dataSourceName);
conn = ds.getXAConnection();
Потоки получают другое соединение из пула, и приложение работает правильно. Однако теперь тип данных соединения в Oracle:
XA-CONNECTION: oracle.jdbc.driver.T4CXAConnection@db5cf3a
CONNECTION: oracle.jdbc.driver.LogicalConnection@2224555
и в PostgreSQL
XA-CONNECTION: org.postgresql.xa.PGXAConnection@42872923
CONNECTION: Pooled connection wrapping physical connection org.postgresql.jdbc.PgConnection@6759de66
Вопрос:
1 - правильно использовать InitialContext. doLookup (...), чтобы получить соединение?
2- Как заставить Арджуну возвращать разные соединения для разных потоков. Это мой пул соединений:
<bean id="application" primary="true" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.arjuna.ats.jdbc.TransactionalDriver" />
<property name="url" value="jdbc:postgresql://localhost:5432/scuserapp" />
<property name="username" value="scuserapp" />
<property name="password" value="abc" />
<property name="initialSize" value="10" />
<property name="maxActive" value="20" />
<property name="maxIdle" value="10" />
</bean>