【发布时间】: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