容器管理事务怎样支持多数据源

10-12-09 b03jsj
我采用的容器管理事务,em和emM是两个不同的数据源,不过已经写在xa的配置里了。我想让容器来管理分布式的事务,可以吗?该怎么做?

以下是我写的例子,执行到emM那边就不行了。

@TransactionManagement(TransactionManagementType.CONTAINER)

public class ClientAuditSessionBeanImpl extends BaseSessionBeanImpl implements

IClientAuditSessionBeanRemote, IClientAuditSessionBeanLocal

{

@PersistenceContext(unitName = "PostgresDS")

protected EntityManager em;

@PersistenceContext(unitName = "MySqlDSDuan")

protected EntityManager emM;

/**

* 客户端鉴权

*

* @param clientAuthenticationREQ 客户端参数bean

*/

@TransactionAttribute(TransactionAttributeType.SUPPORTS)

public ResponseBean clientAudit(

ClientAuthenticationREQ clientAuthenticationREQ)

{

try

{

em.createQuery();//em的操作

dd();

String dd = "dd";

Integer.parseInt(dd);

}

catch (Exception e)

{

logger.error("[" + this.getClass().getSimpleName() + "] "

+ e.getMessage(), e);

/**

* 为了使容器能获取到异常 从而自动回滚

*/

throw new RuntimeException();

}

return rb;

}

@TransactionAttribute(TransactionAttributeType.SUPPORTS)

public void dd()

{

Query d = emM

.createNativeQuery(" insert into tbl_dish (dish_name,dish_price) values ('ddddd','dddd') ");

d.executeUpdate();

}

}

这个代码执行到d.executeUpdate();就报错了,不知道问题在哪里

<datasources>

<xa-datasource>

<jndi-name>PostgresDS</jndi-name>

<xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>

<xa-datasource-property name="serverName">172.20.4.23</xa-datasource-property>

<xa-datasource-property name="portNumber">5432</xa-datasource-property>

<xa-datasource-property name="databaseName">gaea</xa-datasource-property>

<xa-datasource-property name="user">postgres</xa-datasource-property>

<xa-datasource-property name="password">postgres</xa-datasource-property>

<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.PostgreSQLValidConnectionChecker</exception-sorter-class-name>

<no-tx-separate-pools/>

<metadata>

<type-mapping>PostgreSQL 8.4</type-mapping>

</metadata>

</xa-datasource>

<xa-datasource>

<jndi-name>MySqlDSDuan</jndi-name>

<xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>

<xa-datasource-property name="Url">jdbc:mysql://172.20.4.23:3306/dish</xa-datasource-property>

<xa-datasource-property name="User">root</xa-datasource-property>

<xa-datasource-property name="Password">111111</xa-datasource-property>

<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>

<no-tx-separate-pools/>

<metadata>

<type-mapping>mySQL</type-mapping>

</metadata>

</xa-datasource>

</datasources>

请大家帮忙找下原因,谢谢

         

banq
2010-12-10 09:19
这其实就是容器管理事务的问题所在,出错了不知道在哪里错了。

关键问题是容器管理事务的语法太多,从你的注解和配置上粗粗看,都已经面面俱到,还是出错,一般对于出错我们采取断点跟踪,但是容器事务这点很难做到,所以,这种情况下,别人都无法帮助你。

唯一能做的是对这些众多环节一个个去仔细核查,祝你好运,帮不了你,对不起

b03jsj
2010-12-10 09:46
谢谢了。

经过查找,配置xa的文件里加上2行代码

ejb现在不报错了,不过在客户端调用侧报错,如下

javax.transaction.HeuristicMixedException

好像说是一个事务正确提交,而另一个事务产生回滚,导致数据不统一,报错,哎,真难搞。

[该贴被b03jsj于2010-12-10 09:47修改过]

猜你喜欢