Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaEE6 DAO:它应该是@Stateless还是@ApplicationScoped?_Java_Jakarta Ee_Ejb_Java Ee 6_Ejb 3.1 - Fatal编程技术网

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

JavaEE6 DAO:它应该是@Stateless还是@ApplicationScoped?,java,jakarta-ee,ejb,java-ee-6,ejb-3.1,Java,Jakarta Ee,Ejb,Java Ee 6,Ejb 3.1,我目前正在创建一个EJB3数据访问类来处理我的JavaEE6应用程序中的所有数据库操作。现在,由于JavaEE6提供了新的ApplicationScoped注释,我想知道我的EJB应该具有什么状态,或者它是否应该是无状态的 让DAO成为一个@无状态的会话Bean,还是一个@ApplicationScopedBean更好?那么@Singleton呢?这些与DAO相关的选项之间有什么区别 编辑: 我正在使用GlassFish3.0.1和完整的JavaEE6平台 让DAO成为@Stateless会话B

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

让DAO成为一个
@无状态的
会话Bean,还是一个
@ApplicationScoped
Bean更好?那么
@Singleton
呢?这些与DAO相关的选项之间有什么区别

编辑: 我正在使用GlassFish3.0.1和完整的JavaEE6平台

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

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

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

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

  • 我不会将DAO层绑定到EJB API

  • EJB3.1中引入的
    @Singleton
    可以使事情变得更好,但我仍然不会将DAO实现为EJB。我宁愿使用CDI(也可能是一个定制的原型,例如见)

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

    @Pascal: 在我看来,我的DAO不对事务或安全性“负责”,因为容器管理这些服务。我只是在我的DAO中注释方法(只是为了安全,因为事务是自动处理的)。注释已经是“责任”了吗

    好吧,你让我重新考虑我的设计。希望没问题,不要太离题,但也许会有帮助-这就是我今天使用JEE6的方式:

    • JSF访问CDIBean
    • CDIBean访问DAO-EJB,后者 “业务逻辑”是否正确
    • 因此,目前我唯一的“业务逻辑”是执行CRUD,稍后我将为关键任务(如异步方法或计时器服务)添加一些其他EJB
    • 我的DAO是泛型的,使用JPA2标准查询进行类型安全查询(完全没有字符串)
    • 我知道我不需要一个DAO来持久化/更新/删除(太简单了),但我需要它来进行查询;所以我把它们放在一起

    这种方法有什么问题吗

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

    @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() { ... }
    }
    
    @无状态
    公共类ItemFacade实现了可序列化{
    @PersistenceContext(unitName=“catalogPU”)
    私人实体管理者;
    公共无效创建(项){…}
    公共无效编辑(项目){…}
    公共作废删除(项目){…}
    公共项查找(对象id){…}
    公共列表findAll(){…}
    公共列表findRange(int-maxResults,int-firstResult){…}
    public int getItemCount(){…}
    }
    

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

    感谢您的回复!我不想在这里讨论刀是否有意义。对我来说,使用一个是有意义的。至少在Seam 3持久性模块准备好投入生产之前;)所以你说我不应该将DAO层绑定到EJBAPI。但交易和安全又如何呢?如果不是数据库操作->DAO,我在哪里使用这些服务?这些服务不是由CDI提供的,至少不像常规JavaEE6容器那样管理。或者我应该混合使用CDI和EJB?>
    EJB由容器进行池化,因此如果每个池有N个实例和数千个表,那么。如果有数千个表和数千个实体,则可能需要修改设计。除此之外,EJB实例通常是按需创建的,而不是预先创建的,当然也不是一次完成全部池容量。然后,即使创建了数千个实例,数千个实例的内存需求也仅仅是1兆字节,这是完全无关紧要的。启动应用服务器时会有一点额外成本(我认为部署时间就是这个意思)2。DAO为什么鼓励“链接”???在这种情况下,这意味着什么?如果您的意思是一个bean调用另一个bean,那么这在EJB中实际上是非常有效的(只要我们讨论的是本地调用,这当然是这里应该使用的)。注入非常便宜(注入代理),对其他bean的调用显式共享上下文资源,除非显式禁用(这是非常罕见的)。这显然是你的意见,但实际上我绝对会这么做。它提供了轻松注入entitymanager的好处,并且这些方法可以自动创建或加入现有事务。>
    在DAO中包装对域存储的访问不会增加太多价值
    -对于纯CRUD,实体管理器几乎可以直接使用,但在实践中,当您需要在save/update中设置created/last-modified字段时,DAO仍然提供值。对于delete,您将必要的样板代码放在DAO中,因为实体管理器无法删除未附加的实体。此外,DAO还可以包含对相关实体的查询的访问(服务做同样的事情,但是添加