“Transaction locale a déjà 1 non-XA Ressource: impossible d'ajouter plus de ressources” erreur

Après la lecture des questions précédentes sur cette erreur, il semble que tous d'entre eux conclure que vous avez besoin pour activer XA sur toutes les sources de données. Mais:

  1. Que faire si je ne veux pas distribué
    transaction? Que ferais-je si je veux
    début des opérations sur deux
    bases de données en même temps, mais
    valider la transaction sur une base de données
    et de revenir sur la transaction sur
    de l'autre?
  2. Je me demande comment mon code
    lancé effectivement distribué
    des transactions. Il ressemble pour moi comme je suis
    départ complètement séparé
    les transactions sur chacun des
    les bases de données.

Info à propos de l'application:

L'application est un EJB en cours d'exécution sur une Java de Sun Application Server 9.1

- Je utiliser quelque chose comme le printemps suivant contexte, d'établir la session hibernate usines:

<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>

À la fois de la JNDI ressources sont javax.sql.ConnectionPoolDatasoure. En fait ils pointent vers le même pool de connexion, mais nous avons deux différentes ressources JNDI parce qu'il y a la possibilité que les deux, complètement séparées, des groupes de tables se déplacer à différentes bases de données dans le futur.

Ensuite dans le code, je n':

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

La sessionB.beginTransaction() de la ligne de produit l'erreur dans le titre de ce post - parfois. J'ai couru à l'application sur deux différents soleil serveurs d'applications. Sur l'un fonctionne bien, l'autre génère l'erreur. Je ne vois pas de différence dans la façon dont les deux serveurs sont configurés bien qu'ils ne se connectent pas aux différent, mais équivalent des bases de données.

La question est donc

  1. Pourquoi ne pas le code ci-dessus démarrer
    totalement indépendant des transactions?
  2. Comment puis-je le forcer à démarrer
    transactions indépendantes plutôt que de
    une transaction distribuée?
  3. Quelle configuration pourrait causer la différence dans
    comportement entre les deux applications
    les serveurs?

Grâce.

P. S. la trace de la pile est:

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 ...]
Le "Non Transactionnel Connexions" case à cocher dans les paramètres du Pool de connexions a fait le tour. Ce qui est bizarre, c'est que c'était pas de l'app serveurs, mais apparemment, l'un d'eux était de retour non-transactionnelles connexions de toute façon.

OriginalL'auteur jthg | 2010-05-20