【问题标题】:EJJB Timer Transaction -XA ExceptionEJJB 定时器事务 -XA 异常
【发布时间】:2011-10-23 14:15:05
【问题描述】:

我正在使用 EJB 3.0 计时器。当我的 Timeout 方法被调用时,我使用 JPA 在其中一个表中插入一条记录。我使用 JPA 来持久化数据。我在无状态会话 Bean 中定义持久化代码并调用我的超时方法中的本地接口。当线程退出超时方法时,我得到以下异常:

javax.transaction.xa.XAException: JDBC driver does not support XA, hence cannot be a participant in two-phase commit.
   To force this participation, set the GlobalTransactionsProtocol attribute to LoggingLastResource (recommended) or EmulateTwoPhaseCommit for the Data Source

我们的数据库不支持 XA 事务。我们使用 WL 10.3.1。这是我做的代码:

@EJB
private MyejbLocal myejbLocal 

@Timeout
public void callEjb(timer) {
    try {
     myejbLocal .store();

    } catch (EntityExistsException e) {
        e.getMessage();

    } catch (Exception ex) {
        ex.getCause();
    }
}

这是我的实现:

@Override  
public void Store() {
    try {
        Mytable mytable= new Mytable (new Date());
        persist(mytable);

    } catch (EntityExistsException e) {
        e.getMessage();

    } catch (Exception ex) {
        ex.getCause();
    }

}

我不调用flush() 方法。

如果有遗漏请告诉我?

【问题讨论】:

  • 我可以通过让计时器非事务性并让我的 sesssionBean 创建一个新事务来完成这项工作。
  • 这是一种解决方案。当然,如果你的外部事务回滚,Timer 仍然会被创建,所以你的 timeout 方法将需要处理这种情况(如果需要)。最好弄清楚如何为 XA 启用数据源。

标签: jpa ejb-3.0 weblogic-10.x


【解决方案1】:

我也遇到了同样的问题。您需要将您的 JPA 实体操作保存在单独的会话 bean 中,它会起作用。

http://prasunejohn.blogspot.in/2014/02/understanding-ejb-timer-service-31.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 2018-01-14
    相关资源
    最近更新 更多