Какой тип соединения следует использовать для транзакций XA - PullRequest
0 голосов
/ 08 октября 2019

При использовании 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...