JavaEE6 DAO:它应该是@Stateless还是@ApplicationScoped?

2022-09-01 23:42:07

我目前正在创建一个 EJB3 数据访问类来处理 Java EE 6 应用程序中的所有数据库操作。现在,由于Java EE 6提供了新的注释,我想知道我的EJB应该具有什么状态,或者它是否应该是无状态的。ApplicationScoped

让 DAO 成为会话 Bean 还是 Bean 会更好?怎么样?与 DAO 相关的这些选项之间有什么区别?@Stateless@ApplicationScoped@Singleton

编辑:我正在使用Glassfish 3.0.1和完整的Java EE 6平台


答案 1

让DAO成为会话豆@Stateless,还是@ApplicationScoped豆更好?@Singleton呢?与 DAO 相关的这些选项之间有什么区别?

我不会对 DAO 使用无状态会话 Bean:

  1. EJB 由容器池化,因此,如果每个池有 N 个实例和数千个表,则只会浪费资源(更不用说部署时的成本了)。

  2. 将 DAO 实现为 SLSB 将鼓励 EJB 链接,从可伸缩性的角度来看,这不是一个好的做法。

  3. 我不会将 DAO 层绑定到 EJB API。

EJB 3.1 中引入的内容可以使事情变得更好,但我仍然不会将 DAO 实现为 EJB。我宁愿使用CDI(也许是自定义刻板印象,请参阅本文)。@Singleton

或者我根本不会使用DAO。JPA 的实体管理器是域存储模式的实现,在 DAO 中包装对域存储的访问不会增加太多价值。


答案 2

经过一番思考,似乎DAO实际上并不是我想做的事情的正确名称。也许它真的是一个门面,正如帕斯卡所说。我刚刚找到了 Netbeans Petstore 示例 - 一个 JavaEE6 示例应用程序,请参阅此处 - 其中他们有一个 ItemFacade,负责从数据库中查找/创建/删除实体。这是一个无状态会话豆。看起来像这样:

@Stateless
public class ItemFacade implements Serializable {
    @PersistenceContext(unitName = "catalogPU")
    private EntityManager em;

    public void create(Item item) { ... }
    public void edit(Item item) { ... }
    public void remove(Item item) { ... }
    public Item find(Object id) { ... }
    public List<Item> findAll() { ... }
    public List<Item> findRange(int maxResults, int firstResult) { ... }
    public int getItemCount() { ... }
}

因此,作为一个结论,我不再称我的DAO DAO,而只是例如PersonEJB(我认为“PersonFacade”可能会被误解),并使其也@Stateless,因为我认为Netbeans示例可以被认为是精心设计的。


推荐