gpt4 book ai didi

multithreading - 什么时候要注意EJB中的多线程?

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

我了解App Server会负责线程处理,因此开发人员应只专注于业务逻辑...
但是考虑一个例子。无状态EJB的成员类型为CountManager。

@WebService
@Stateless
public class StatelessEJB {
private CountManager countManager;
...
public void incrementCount() {countManager.incrementCount();}
public int getCount(){return countManager.getCount();}
}

还有CountManager
 public class CountManager {
public void increaseCount() {
// read count from database
// increase count
// save the new count in database table.
}

public int getCount() {
// returns the count value from database.
}
}

开发人员应该在这里考虑多线程。如果您将CountManager也设为EJB,我想问题就不会消失。
开发人员需要注意的一般准则是什么?

更新:
更改了代码。假设EJB的方法作为Web服务公开,因此我们无法控制客户端调用它们的顺序。交易属性是默认属性。在多线程情况下,此代码是否正确运行?

最佳答案

EJB具有线程安全性这一事实并不意味着不同的方法调用将为您提供一致的结果。

EJB使您确定,特定 EJB实例中的每个方法都将由唯一一个线程执行。这不会使您避免多个用户访问您的EJB的不同实例,从而导致不一致的结果危险。

您的CountManager似乎是一个常规的Java类,这意味着您在无状态EJB中拥有一个状态。这不是很好,并且在这种情况下,EJB线程安全不会保护您免受任何伤害。您可以同时通过多个EJB实例访问您的对象。

在客户端的第一个方法调用StatelessEJB.incrementCount()(启动事务-默认TransactionAttribute)和第二个客户端的方法调用StatelessEJB.getCount()(启动新的事务)之间,可能会发生许多事情,并且count的值可以更改。

如果您将其更改为EJB,我认为您再安全不过了。如果它是SLSB,则它仍然不能具有任何状态。如果状态不是作为EJB字段变量而是由数据库获取的数据实现,那肯定比它更好,但仍然如此-事务对您不是真正的帮助,因为您的WebService客户端仍单独执行这两种方法,因此将发生两个不同的事务。

简单的解决方案是:

  • 使用可以与您的EJB事务
  • 同步的数据库(SLSB中没有状态)
  • 在事务内执行这两个方法(例如WebService客户端的incrementAndGet(-)方法)。

  • 比您可以肯定的是,您获得的结果是一致的。

    关于multithreading - 什么时候要注意EJB中的多线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8325555/

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