首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JavaEE6 DAO:应该是@无状态的还是@ApplicationScoped的?

JavaEE6 DAO:应该是@无状态的还是@ApplicationScoped的?
EN

Stack Overflow用户
提问于 2010-07-11 20:58:38
回答 3查看 18K关注 0票数 22

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

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

编辑:我使用的是带有完整JavaEE6平台的Glassfish 3.0.1

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-12 04:58:31

让DAO成为@无状态会话Bean或@ApplicationScoped Bean会更好些吗?@Singleton怎么样?与DAO相关的这些选项之间有什么区别?

我不会为DAOs使用无状态会话Beans:

  1. EJB是由容器池化的,所以如果每个池有N个实例和数千个表,那么只会浪费资源(更不用说部署时的成本了)。
  2. 将DAO实现为SLSB会鼓励EJB链接,但从可伸缩性的角度来看,这不是一个好的做法。
  3. 我不会将DAO层绑定到EJB。

EJB3.1中引入的@Singleton可以让事情变得更好一些,但我仍然不会将DAOs实现为EJB。我更喜欢使用CDI (也可能是一个自定义的构造型,比如this article )。

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

票数 17
EN

Stack Overflow用户

发布于 2010-07-14 22:29:54

经过重新思考,似乎DAO实际上不是我想要做的事情的正确名称。也许,正如帕斯卡所说,这真的只是一种假象。我刚刚找到了Netbeans Petstore示例-一个JavaEE6示例应用程序,请参见here -他们有一个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() { ... }
}

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

票数 2
EN

Stack Overflow用户

发布于 2010-07-12 07:33:29

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

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

  • JSF访问CDI Bean,
  • CDI Bean访问执行“业务逻辑”
  • 的DAO-EJB所以目前我唯一的“业务逻辑”是执行CRUD,稍后我将为关键任务添加一些其他EJB,如异步方法或计时器服务。
  • 我的DAO是泛型的,它使用JPA2 Criteria查询来执行类型安全查询(根本不需要字符串)
  • 我知道我不需要用于持久化/更新/删除(太简单)的DAO,但是我的查询需要它;所以我只是将它们放在一起

这种方法有什么问题吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3223112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档