【问题标题】:Java EE 6 EJB tutorial : why not using @Singleton instead of @StatelessJava EE 6 EJB 教程:为什么不使用 @Singleton 而不是 @Stateless
【发布时间】:2013-04-12 22:47:03
【问题描述】:

我查看了 Java EE 6 教程中的一个 EJB 示例。在这个例子中,我想知道我是否可以只使用 @Singleton 而不是 @Stateless ?

package converter.ejb;

import java.math.BigDecimal;
import javax.ejb.*;

    @Stateless
    public class ConverterBean {

        private BigDecimal yenRate = new BigDecimal("83.0602");
        private BigDecimal euroRate = new BigDecimal("0.0093016");

        public BigDecimal dollarToYen(BigDecimal dollars) {
            BigDecimal result = dollars.multiply(yenRate);
            return result.setScale(2, BigDecimal.ROUND_UP);
        }

        public BigDecimal yenToEuro(BigDecimal yen) {
            BigDecimal result = yen.multiply(euroRate);
            return result.setScale(2, BigDecimal.ROUND_UP);
        }
    }

在我看来像一个 Util 方法。

如果我不使用 EJB,我可以在此 ConverterBean 上使用静态方法。

还有一个问题。我知道这是一个简单的示例,但是如果我使用示例中的 servlet 中的此代码,为什么只为此使用 EJB?

【问题讨论】:

  • 关于第二个问题,你能详细说明一下吗?我看不出你的意思

标签: singleton ejb java-ee-6 stateless


【解决方案1】:

是的,我想说这对于EJBs 来说是一个糟糕的用例。这个方法肯定应该在一些声明为静态方法的实用程序类中。对于 Singleton,如果不需要,请不要使用(当然,您可以制作此类 Singleton,但您会获得什么?)。让您的代码尽可能简单。

【讨论】:

    【解决方案2】:

    如果你只使用@Singleton 而不是@Stateless,你会降低应用程序的性能。因为,有两种方法可以访问@Singleton bean,容器管理和 bean 管理。默认是容器管理的,默认锁是 LockType.WRITE。因此只有一个客户端可以同时访问该 bean,其他客户端将被阻止。

    【讨论】:

    • 谢谢。如果我使用@Singleton,我会期待这样的事情。我很想知道我是否可以用单例替换无状态,所以答案是肯定的,使用 EJB 是一个糟糕的用例,这是我想听到的。
    【解决方案3】:

    如果我只需要一类实用程序,我真的看不出使用 EJB 的原因。 我认为您可以将它用作一个简单的最终类实用程序并在其中使用静态方法。 如果您真的需要从容器事务、使用 JPA、一些远程服务或类似的东西中受益,您会使用 EJB。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      • 2015-01-22
      • 2013-06-30
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 2018-09-04
      相关资源
      最近更新 更多