gpt4 book ai didi

java - 当已经在 ejb 内部时打开新事务

转载 作者:太空宇宙 更新时间:2023-11-04 12:57:12 24 4
gpt4 key购买 nike

考虑以下情况:

@Stateless
@Clustered
public class FacadeBean implements Facade {

@EJB
private Facade facade;

@Override
public void foo(List<Integer> ids) {
// read specific id's from the db
for (Integer id : ids) {
facade.bar(id);
}
}

@Override
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void bar(Integer id) {
// save something to the db
}

}

从 ejb 外部调用方法 foo。我希望每个 id 在自己的事务中执行,以便数据直接保存到数据库中。在此类之外不可能有 foreach。我想知道最好的方法是什么?目前,我再次注入(inject)接口(interface),以跨越 ejb 边界(以便对 TransactionAttribute 进行评估)。

最佳答案

您的循环引用方法非常好。 EJB 中允许循环引用。为了启动新事务或 @Asynchronous 线程,这甚至是强制性的(否则当前线程仍会阻塞)。

@Stateless
public class SomeService {

@EJB
private SomeService self; // Self-reference is perfectly fine.


// Below example starts a new transaction for each item.

public void foo(Iterable<Long> ids) {
for (Long id : ids) {
self.fooInNewTransaction(id);
}
}

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void fooInNewTransaction(Long id) {
// ...
}


// Below example fires an async thread in new transaction.

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void bar(Iterable<Long> ids) {
for (Long id : ids) {
self.fooAsynchronously(id);
}
}

@Asynchronous
public void fooAsynchronously(Long id) {
// ...
}

}

仅在较旧的容器中,这不起作用,尤其是带有古老 EJB 3.0 API 的 JBoss AS 5。这就是为什么人们发明了像 SessionContext#getBusinessObject() 这样的解决方法,甚至通过 JNDI 手动抓取。

现在这些已经没有必要了。这些是变通办法,而不是解决方案。

我个人只会在交易方面采取相反的做法。 foo() 方法显然从来就不是事务性的。

@Stateless
public class SomeService {

@EJB
private SomeService self;

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void foo(Iterable<Long> ids) {
for (Long id : ids) {
self.foo(id);
}
}

public void foo(Long id) {
// ...
}

}

根据具体的功能需求,您甚至可以制作foo(Long id) @Asynchronous,从而加快任务速度。

关于java - 当已经在 ejb 内部时打开新事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35287692/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com