Actualmente estoy creando una clase de acceso a datos EJB3 para manejar todas las operaciones de bases de datos en mi aplicación Java EE 6. Ahora, dado que Java EE 6 proporciona la nueva Annotation de ApplicationScoped, me pregunto qué estado debería tener mi EJB, o si debería ser sin estado.DAO de JavaEE6: ¿Debería ser @Stateless o @ApplicationScoped?
¿Sería mejor dejar que el DAO sea un @Stateless Session Bean, o un @ApplicationScoped Bean? ¿Qué hay de @Singleton? ¿Cuáles son las diferencias entre estas opciones relacionadas con un DAO?
EDIT: estoy usando GlassFish 3.0.1 con la plataforma completa de Java EE 6
Gracias por la respuesta! No quiero discutir aquí si un DAO tiene sentido. Para mí tiene sentido usar uno. Al menos hasta que el Seam 3 Persistence Module esté listo para la producción;) Así que dices que no debo atar la capa DAO a la API EJB. Pero, ¿y las transacciones y la seguridad? ¿Dónde usaría esos servicios, si no fuera por las operaciones de la base de datos -> DAO? Estos servicios no son proporcionados por CDI, al menos no de la manera en que lo hace el contenedor regular JavaEE6. O tal vez debería mezclar CDI y EJB? – ifischer
@ifischer: DAOs ciertamente NO debe ser responsable del control de la transacción y la demarcación (o seguridad), use un SLSB (una sesión de fachada) para eso. Entonces, sí, use EJB y CDI. –
> 'Los EJB se agrupan en el contenedor, por lo tanto, si tiene N instancias por grupo y miles de tablas' - 1. Si tiene miles de tablas y miles de entidades, es posible que deba revisar su diseño. Además de eso, las instancias de EJB generalmente se crean a pedido y no de antemano, y ciertamente no para la capacidad total de la agrupación, todo a la vez. Entonces, incluso si se crean miles de ellos, los requisitos de memoria de miles de instancias son apenas un megabyte, lo que es completamente insignificante. Hay un pequeño costo adicional cuando se inicia el servidor de la aplicación (que tomo es lo que quiere decir con el tiempo de implementación) –