본문 바로가기

개발환경/WAS

Adding multiple last resources is disallowed.

환경: JDK1.6.0_21 + JBoss EAP 4.3.2 + Spring 2.5.6 + iBatis 2.3.4

위의 환경에서 2개이상의 DataSource를 설정하고 JTA 트랜잭션을 설정했을 때 아래와 같은 에러가 발생했다. 

[com.arjuna.ats.internal.jta.transaction.arjunacore.lastResource.disallow] Adding multiple last resources is disallowed. Current resource is org.jboss.resource.connectionmanager.TxConnectionManager$LocalXAResource@473fc2
09:29:19,759[ERROR] (JakartaCommonsLoggingImpl.java:19) - Error calling Connection.prepareStatement:
org.jboss.util.NestedSQLException: Could not enlist in transaction on entering meta-aware object!; - nested throwable: (javax.transaction.SystemException: java.lang.Throwable: Unabled to enlist resource, see the previous warnings. tx=TransactionImple < ac, BasicAction: -3f57fff1:c23b:4d420dcd:e status: ActionStatus.ABORT_ONLY >); - nested throwable: (org.jboss.resource.JBossResourceException: Could not enlist in transaction on entering meta-aware object!; - nested throwable: (javax.transaction.SystemException: java.lang.Throwable: Unabled to enlist resource, see the previous warnings. tx=TransactionImple < ac, BasicAction: -3f57fff1:c23b:4d420dcd:e status: ActionStatus.ABORT_ONLY >))
at org.jboss.resource.adapter.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:96)
at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:113)

다음을 URL에서 해결의 실마리를 찾았다.

http://venugopaal.wordpress.com/2009/02/11/jboss5-adding-multiple-last-resources-is-disallowed/

1. You have 2 EAR files in a single server instance. Not just 2 ear files, but from within a transaction of a deployed EAR file, when you try to access the other EAR file, get some data from there and try to commit the transaction. This is not allowed in arjuna API (AFAIK). To fix this, edit JBOSS_HOME/server/default/conf/jbossjta-properties.xml and add the following line

<property name="com.arjuna.ats.jta.allowMultipleLastResources" value="true" />

The problem does not stop here..The datasource has to support it.

Modify the *ds.xml to look like this ( localtxdatasource would not work) :

<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<xa-datasource>
<jndi-name>CatMgrDS</jndi-name>
<xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
<xa-datasource-property name="URL">jdbc:mysql://192.168.157.57:3306/30cm</xa-datasource-property>
<xa-datasource-property name="User">root</xa-datasource-property>
<xa-datasource-property name="Password">root</xa-datasource-property>
<!– the minimum size of the connection pool –>
<min-pool-size>1</min-pool-size>
<!– The maximum connections in a pool/sub-pool –>
<max-pool-size>4</max-pool-size>
</xa-datasource>
</datasources>

Next step is to make sure you have the latest version of mysql-connector(in my case atleast). Versions prior to 5.1.10 doesn’t support XA datasource(ref :http://marc.info/?l=kandula-dev&m=113945114400475&w=2) I replaced my old mysql connector with the latest one.

Things should work fine then. will keep this writing up to date to my best possible extent


필자의 경우 첫번째 방법인 

JBOSS_HOME/server/{instance}/conf/jbossjta-properties.xml 에

<property name="com.arjuna.ats.jta.allowMultipleLastResources" value="true" />

를 추가함으로써 해결했다.

...
<properties depends="arjuna" name="jta">
    <property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.JBMESSAGING1"

            value="org.jboss.jms.server.recovery.MessagingXAResourceRecovery;java:/DefaultJMSProvider"/>
    <property name="com.arjuna.ats.jta.supportSubtransactions" value="NO"/>
    <property name="com.arjuna.ats.jta.jtaTMImplementation"

            value="com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionManagerImple"/>
    <property name="com.arjuna.ats.jta.jtaUTImplementation"
            value="com.arjuna.ats.internal.jta.transaction.arjunacore.UserTransactionImple"/>

<property name="com.arjuna.ats.jta.allowMultipleLastResources" value="true" />

</properties>

...