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

我采用的容器管理事务,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>

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

这其实就是容器管理事务的问题所在,出错了不知道在哪里错了。

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

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

谢谢了。
经过查找,配置xa的文件里加上2行代码
ejb现在不报错了,不过在客户端调用侧报错,如下
javax.transaction.HeuristicMixedException
好像说是一个事务正确提交,而另一个事务产生回滚,导致数据不统一,报错,哎,真难搞。
[该贴被b03jsj于2010-12-10 09:47修改过]