1

我想从 EJB 3.0 中的单个无状态会话 bean 访问两个数据库。我创建了一个会话 bean,在其中声明了两个实体管理器,以便与两个数据库进行通信。实体管理器在我的无状态会话 bean 中以这种方式定义:

@PersistenceContext (unitName="abc") private EntityManager manager;
@PersistenceContext (unitName="xyz") private EntityManager manager1;

使用第一个实体管理器,我从一个数据库中获取数据,然后使用第二个实体管理器将其插入到第二个数据库中。我现在的问题是我可以声明两个实体管理器,但我不能同时使用它们。我必须使用其中一个注释掉,否则我会得到这个异常:

Caused by: org.hibernate.exception.GenericJDBCException: Cannot open connection
Caused by: org.jboss.util.NestedSQLException: Could not enlist in transaction on
entering meta-aware object!;
  - nested throwable:" "Caused by:  
    org.jboss.resource.JBossResourceException: Could not enlist in transaction on entering meta-aware object"
    "Caused by: javax.transaction.SystemException: java.lang.Throwable:"
4

1 回答 1

0

无状态会话 bean 中的每个方法都会获得一个事务。如果您在该方法中访问多个数据库,则必须有 xa 数据源,而不是 tx。

我以前遇到过这种情况,并且有一个解决方法。为每个数据库创建单独的无状态会话 bean,然后关闭原始无状态会话 bean 中原始方法的事务:

@EJB(mappedName="com.abc.AbcManager")
private AbcManager abcManager;

@EJB(mappedName="com.xyz.XyzManager")
private XyzManager xyzManager;

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public MyResponse getMyData(MyRequest request) throws MyException {
    Collection<Data> data = abcManager.getData();

    xyzManager.storeData(data);

    return null;
}

新会话 bean 上的方法将创建它们自己的事务,但您仍然可以让一个无状态会话 bean 协调其他两个。

于 2013-04-16T14:23:27.827 回答