小编典典

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

java

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

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

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


阅读 226

收藏
2020-10-07

共1个答案

小编典典

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

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

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

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

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

@Singleton在EJB
3.1中引入可以让事情更好一点,但我仍然不会实现的DAO作为EJB的。我宁愿使用CDI(也许是自定义构造型,例如,请参见本文)。

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

2020-10-07