【问题标题】:EJB 3.0 Access two databases from single session bean EJB 3.0EJB 3.0 从单个会话 bean EJB 3.0 访问两个数据库
【发布时间】:2012-12-29 11:51:26
【问题描述】:

我想从 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:"

【问题讨论】:

  • 您很可能需要使用 XA 数据源。

标签: ejb-3.0 jboss5.x


【解决方案1】:

无状态会话 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 协调其他两个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 2011-11-05
    • 2012-04-19
    • 1970-01-01
    • 2013-08-02
    相关资源
    最近更新 更多