Llamar a una base de datos directamente a través de un servlet vs usar un intermediario EAO y EJB

Estoy mostrando texto y xml en una página web a través de un servlet. El servlet simplemente carga el HTML / XML en la página durante la carga a través de llamadas en el método getPost (). Ahora que lo tengo funcionando de la manera que quiero, mi próximo paso es reemplazar el texto de la pantalla estática con llamadas a la base de datos para que pueda mostrar información de forma dinámica. Mi pregunta es:

Cuál es la mejor manera de hacer esto. Estoy usando JPA y entidades para la persistencia, pero tengo la opción de hacer llamadas directas a los elementos persistentes o pasar por un objeto de acceso a datos / entidades que he creado. Seguí un tutorial que usaba EAO y Entidades con EJB como una forma de enseñar las mejores prácticas. Sin embargo, todavía no veo el valor de hacer esto. Parece demasiado complicado pasar por 3 clases cuando solo podía acceder a los datos directamente.

Entonces, ¿es este el método preferido? ¿O deberían los servlets acceder a los datos directamente oa través de EAO?

Muchas Gracias

preguntado el 08 de noviembre de 11 a las 15:11

Mi pregunta probablemente no sea muy clara y supongo que en realidad solo estoy buscando una justificación para la forma en que creo que se supone que debe hacerse en base a lo que he leído. Podría leer sobre el patrón DAO, pero creo que alguien podría tener una explicación más simple de por qué pasar por EJB y DAO es beneficioso, pero si la pregunta / respuesta no es muy obvia, puedo marcar esto para eliminarlo: / -

3 Respuestas

Si no lo necesita, no lo haga.

No introduzca una capa de abstracción adicional sin una razón. Es más difícil de mantener, y si realmente no lo necesita, terminará con un montón de código muerto (delegados vacíos).

Entonces, el primer paso que haría si fuera usted, usaría el JPA como una capa de persistencia. Le permitirá deshacerse de sus clases DAO adicionales. EntityManager (puede pensar en él como un punto de entrada al JPA) es un objeto de acceso a datos en sí mismo. Su código de servlets no debería depender directamente de la base de datos, por lo que un EntityManager es una gran separación de preocupaciones en su caso.

Entonces puede pensar en separar su código de presentación (Servlet) de las operaciones orientadas a datos. Puede hacerlo utilizando, por ejemplo, un CDI e implementando esta lógica en POJO simples. Esto le permitirá (Servlet) no depender del código utilizado para obtener o transformar sus datos. Por lo general, su servlet solo 'obtendrá los datos' (no tiene que saber de dónde provienen).

Utilice EJB si necesita los servicios que introducen (transaccionalidad, seguridad de subprocesos, temporizadores, llamadas asincrónicas, puntos de entrada adicionales como servicios web SOAP o REST, acceso JMX, agrupación, ...).

HTH.

respondido 08 nov., 11:20

Gracias, me encantaría recibir más información sobre este tipo de temas. En este momento, como nuevo estudiante de JEE, siento que probablemente estoy usando EJB innecesariamente cuando podría estar usando un POJO. ¿Puedes usar CDI con POJO? En este momento tengo un bean de sesión que utilizo para manejar mi "lógica de negocios", que en realidad no es lógica, sino solo llamadas a mi DAO y cualquier otro bloque / clase de ejecución importante que tenga. Es casi como un despachador / interfaz porque entonces solo tengo que inyectar ese bean en mi servlet y puedo hacer referencia a cualquier método en mi proyecto. - Randnum

@ user988231 si se trata del CDI, solo eche un vistazo a la documentación de Weld (implementación del CDI): docs.jboss.org/weld/reference/latest/en-US/html - es una gran fuente de conocimiento. - Piotr Nowicki

Aunque probablemente me gustaría hacer que muchas de estas llamadas sean asincrónicas para que, a medida que agregue funcionalidad, la necesidad se vuelva más evidente. - Randnum

Bueno, no me malinterpretes, un EJB sigue siendo un POJO (como sabes, solo anota la clase @Stateless, @Stateful, etc.) Si su lógica es un CRUD muy simple, puede crear un servicio genérico y simplemente extenderlo / implementarlo. - Piotr Nowicki

@ user988231 exactamente ese es el punto. Si necesita un acceso asincrónico, verá el valor agregado de usar EJB. Tan pronto como comience a usar EntityManager, verá otro valor agregado: transacciones administradas por contenedores que le evitarán codificarlas explícitamente. - Piotr Nowicki

Hay diferentes factores, es útil conocer ambos enfoques.

Los EJB son más simples y tienen muchas funciones para la gestión de transacciones. Sin EJB, el código para persistir sería más detallado.

Quizás esto ayude a comprender mejor.

http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html

respondido 08 nov., 11:20

Si se deben usar DAO o no en un IMO básico por caso de uso.

Siguiendo un enlace a una respuesta que podría ayudarlo a resolver esta.

¿Cómo se debe utilizar EntityManager en una capa de servicio y una capa de acceso a datos bien desacopladas?

contestado el 23 de mayo de 17 a las 15:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.