gpt4 book ai didi

jsf - EJB @Asynchronous 检索 JSF 中实时插入的行似乎是线程锁定的

转载 作者:行者123 更新时间:2023-12-03 04:52:12 25 4
gpt4 key购买 nike

我正在努力实现以下目标:

EJB3 单例

@Singleton
@Startup
public class SomeSingleton implements SomeSingletonLocal {

// Entity Manager injection
private EntityManager _entity_manager;

@Override
@Asynchronous
public void createScenario(){
method1();
method2();
// ...
}

public void method1(){
// Persist an Event in a Database.
}

public void method2(){
// Persist an Event in a Database.
}

}

托管 Bean

@ManagedBean
@RequestScoped
public class SomeManagedBean{

// Entity Manager injection
private EntityManager _entity_manager;

@EJB
private SomeSingletonRemote _singleton;

public void createScenario(){
_singleton.createScenario();
}

public List<Event> getEventList(){
// Retrieve events from database
}
}

JSF View

<h:form>
<p:commandButton value="Start Long Stuff"
actionListener="#{SomeManagedBean.createScenario}" />
<h:outputText id="count" value="#{SomeManagedBean.getEventList.size()}" />
<p:poll interval="1" update="count" />
</h:form>

日志

->SomeManagedBean.getEventList()
<-SomeManagedBean.getEventList() // Size = 0

// Buton clicked
->SomeManagedBean.createScenario()
      ->SomeSingleton.createScenario()
<-SomeManagedBean.createScenario()

->SomeManagedBean.getEventList() // will end at the end of SomeSingleton.createScenario
->SomeSingleton.method1()
<-SomeSingleton.method1() // persist
...
->SomeSingleton.methodN()
<-SomeSingleton.methodN() // persist

<-SomeSingleton.createScenario()

<-SomeManagedBean.getEventList() // size = N

我预计在两次 methodI() 调用之间(即每秒)至少有一次对 getEventList 的调用。当进入SomeSingleton.createScenario()时,我不知道为什么getEventList暂停了。

看起来实体管理器或 createScenario 内的事务存在锁定。这是重入问题吗?

最佳答案

默认情况下,@Singleton 确实是读/写锁定的。这与事务并不严格相关,而是与并发相关。另请参见 a.o. Java EE 7 tutorial on the subject .

解决这个问题的一种方法是设置 @ConcurrencyManagementBEAN 。通过这种方式,您基本上告诉容器根本不用担心并发性,并且您自己承担所有责任。

@Singleton
@ConcurrencyManagement(ConcurrencyManagementType.BEAN)
public class SomeSingleton {}

另一种方法是显式设置 @LockREAD类或只读方法,以便可以同时调用它们。仅当在同一实例上调用具有显式 @Lock(LockType.WRITE) 的方法时,才会发生锁定。

@Singleton
@Lock(LockType.READ)
public class SomeSingleton {}

关于jsf - EJB @Asynchronous 检索 JSF 中实时插入的行似乎是线程锁定的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33754603/

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