我当前正在创建一个EJB3数据访问类,以处理Java EE 6应用程序中的所有数据库操作。现在,由于Java EE 6提供了新的ApplicationScoped注释,所以我想知道EJB应该具有什么状态,或者它应该是无状态的。
ApplicationScoped
让DAO成为@Stateless会话Bean还是@ApplicationScopedBean 会更好?那@Singleton呢 这些与DAO相关的选项之间有什么区别?
@Stateless
@ApplicationScoped
@Singleton
编辑: 我在完整的Java EE 6平台上使用Glassfish 3.0.1
最好让DAO是@Stateless会话Bean或@ApplicationScoped Bean?那@Singleton呢?这些与DAO相关的选项之间有什么区别?
我不会为DAO使用无状态会话Bean:
EJB由容器池化,因此,如果每个池中有N个实例并有数千个表,那么您将浪费资源(更不用说部署时的成本了)。
将DAO实施为SLSB会鼓励EJB链接,从可伸缩性的角度来看,这不是一个好习惯。
我不会将DAO层绑定到EJB API。
将@Singleton在EJB 3.1中引入可以让事情更好一点,但我仍然不会实现的DAO作为EJB的。我宁愿使用CDI(也许是自定义构造型,例如,请参见本文)。
否则我根本不会使用DAO。JPA的实体管理器是域存储模式的实现,并且在DAO中包装对域存储的访问不会增加太多价值。