Ошибка «Локальная транзакция уже имеет 1 ресурс не XA: невозможно добавить больше ресурсов»

После прочтения предыдущих вопросов об этой ошибке кажется, что все они пришли к выводу, что вам нужно включить XA во всех источниках данных. Но:

Что если я не хочу распределенную транзакцию? Что мне делать, если я хочу начать транзакции в двух разных базах данных одновременно, но зафиксировать транзакцию в одной базе данных и откатить транзакцию в другой?Мне интересно, как мой код фактически инициировал распределенную транзакцию. Мне кажется, что я запускаю совершенно отдельные транзакции в каждой из баз данных.

Информация о приложении:

Приложение представляет собой EJB-компонент, работающий на сервере приложений Sun Java 9.1.

Я использую что-то вроде следующего весеннего контекста для настройки фабрик Hibernate:

<bean id="dbADatasource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="jdbc/dbA"/>
</bean>

<bean id="dbASessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dbADatasource" />
    <property name="hibernateProperties">
        hibernate.dialect=org.hibernate.dialect.Oracle9Dialect
        hibernate.default_schema=schemaA
    </property>
    <property name="mappingResources">
        [mapping resources...]
    </property>
</bean>

<bean id="dbBDatasource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="jdbc/dbB"/>
</bean>

<bean id="dbBSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dbBDatasource" />
    <property name="hibernateProperties">
        hibernate.dialect=org.hibernate.dialect.Oracle9Dialect
        hibernate.default_schema=schemaB
    </property>
    <property name="mappingResources">
        [mapping resources...]
    </property>
</bean>

Оба ресурса JNDI являются javax.sql.ConnectionPoolDatasoure. На самом деле они оба указывают на один и тот же пул соединений, но у нас есть два разных ресурса JNDI, потому что существует вероятность того, что две совершенно разные группы таблиц в будущем перейдут в разные базы данных.

Затем в коде я делаю:

sessionA = dbASessionFactory.openSession();
sessionB = dbBSessionFactory.openSession();
sessionA.beginTransaction();
sessionB.beginTransaction();

Строка sessionB.beginTransaction () выдает ошибку в заголовке этого поста - иногда. Я запустил приложение на двух разных серверах приложений Sun. На одном работает нормально, на другом выдает ошибку. Я не вижу разницы в том, как настроены два сервера, хотя они подключаются к разным, но эквивалентным базам данных.

Так что вопрос

Почему приведенный выше код не запускает полностью независимые транзакции?Как я могу заставить его запускать независимые транзакции, а не распределенную транзакцию?Какая конфигурация может вызвать разницу в поведении между двумя серверами приложений?

Благодарю.

Постскриптум трассировка стека:

Local transaction already has 1 non-XA Resource: cannot add more resources. 
at com.sun.enterprise.distributedtx.J2EETransactionManagerOpt.enlistResource(J2EETransactionManagerOpt.java:124) 
at com.sun.enterprise.resource.ResourceManagerImpl.registerResource(ResourceManagerImpl.java:144) 
at com.sun.enterprise.resource.ResourceManagerImpl.enlistResource(ResourceManagerImpl.java:102) 
at com.sun.enterprise.resource.PoolManagerImpl.getResource(PoolManagerImpl.java:216) 
at com.sun.enterprise.connectors.ConnectionManagerImpl.internalGetConnection(ConnectionManagerImpl.java:327) 
at com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:189) 
at com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:165) 
at com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:158) 
at com.sun.gjc.spi.base.DataSource.getConnection(DataSource.java:108) 
at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:82) 
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446) 
at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167) 
at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:142) 
at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:85) 
at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1354) 
at [application code ...]

Ответы на вопрос(0)

Ваш ответ на вопрос