2010-07-11 15 views
16

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

Respuesta

12

whould sea mejor dejar que el DAO ser un @Stateless bean de sesión, o un grano de @ApplicationScoped ? ¿Qué hay de @Singleton? ¿Cuáles son las diferencias entre estas opciones relacionadas con un DAO?

No utilizaría Beans de sesión sin estado para DAOs:

  1. EJB se agrupan por el contenedor de modo que si usted tiene N instancias por la piscina y miles de mesas, sólo vamos a desperdiciar recursos (ni siquiera mencionar el costo en el momento del despliegue).

  2. La implementación de DAO como SLSB alentaría el encadenamiento EJB, que no es una buena práctica desde el punto de vista de la escalabilidad.

  3. No ataría la capa DAO a la API EJB.

El @Singleton introdujo en EJB 3.1 podría hacer las cosas un poco mejor, pero todavía no aplicaría DAOs como EJB. Prefiero usar CDI (y tal vez un estereotipo personalizado, vea this article por ejemplo).

O no usaría ningún DAO. El administrador de entidades de JPA es una implementación del patrón Domain Store y el ajuste del acceso a un Almacén de dominios en un DAO no agrega mucho valor.

+0

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

+0

@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. –

+5

> '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) –

0

@Pascal: En mi opinión, mi DAO no es "responsable" de la transacción o la seguridad, ya que el contenedor gestiona estos servicios. Solo estoy anotando los métodos en mi DAO (solo por seguridad, ya que las transacciones se manejan automáticamente). ¿Las anotaciones ya son "responsabilidad"?

Bien, entonces me haces repensar sobre mi diseño. Espero que esta bien y no demasiado fuera de tema, pero tal vez ayuda - esta es la forma en que estoy usando hoy JEE6:

  • JSF tiene acceso a un CDI Bean,
  • el CDI frijol accede a la DAO-EJB, que ¿la "lógica de negocios"
  • por lo que actualmente mi única "lógica de negocios" es hacer CRUD, más tarde agregaré algunos otros EJB para tareas críticas como métodos asíncronos o servicios de temporizador.
  • mi DAO es genérico y se utiliza la consulta Criterios JPA2 hacer typesafe consultas (sin condiciones) en todo
  • Yo sé que no necesito un DAO para persistir/actualizar/eliminar (demasiado simple), pero necesito para mis consultas; así que simplemente los puse juntos

¿Hay algún problema con este enfoque?

1

Después de un replanteamiento, parece que DAO realmente no es el nombre correcto para lo que quería hacer. Tal vez realmente es una fachada, como dijo Pascal. Acabo de encontrar el ejemplo Netbeans Petstore - una aplicación de ejemplo JavaEE6, vea here - donde tienen un ItemFacade que es responsable de encontrar/crear/eliminar entidades de la base de datos. Es un Bean de sesión sin estado. Se ve así:

@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() { ... } 
} 

Así como conclusión no llamo mi DAO DAO más, pero en su lugar sólo por ejemplo PersonEJB (creo "PersonFacade" pueda ser mal interpretado) y hago también @Stateless, ya que creo el ejemplo de Netbeans se puede considerar como bien diseñado.

+0

Cuál es la última parte de mi respuesta: no DAO en absoluto y una [fachada de sesión] (http: //java.sun. com/blueprints/corej2eepatterns/Patterns/SessionFacade.html) para control de transacciones y seguridad, siendo un SLSB el candidato natural en Java EE. Ahora, tengo que decir que primero, la respuesta anterior en realidad no responde a su pregunta * inicial * y segundo, (virtualmente) reformulando su propia pregunta para que coincida con su respuesta no me motiva a pasar más tiempo en esto. Buena suerte de todos modos. –

+1

Se cambió la respuesta aceptada. Estás feliz ahora? ;) Tienes razón, esta respuesta no tiene nada que ver con mi respuesta inicial. Gracias por tu ayuda. – ifischer

Cuestiones relacionadas