Foros del Web » Programación para mayores de 30 ;) » Java »

Transaccionalidad con EJB

Estas en el tema de Transaccionalidad con EJB en el foro de Java en Foros del Web. Hola, estoy desarrollando una aplicacion con EJB stateless donde los servlets son los clientes. Los EJB se comunican con la base de datos mediante el ...
  #1 (permalink)  
Antiguo 06/12/2004, 15:57
 
Fecha de Ingreso: enero-2004
Mensajes: 144
Antigüedad: 20 años, 2 meses
Puntos: 0
Transaccionalidad con EJB

Hola, estoy desarrollando una aplicacion con EJB stateless donde los servlets son los clientes. Los EJB se comunican con la base de datos mediante el patrón DAO. El que "más sabe de acá" me pidió que la transaccionalidad de las operaciones en la base de datos las trabajara a nivel de EJB. O sea, los métodos ejecutados por el EJB deben ser transaccionales, y si un EJB llama a otro, y éste se cae, se debe anular todo.


Alguien sabe como hacer esto?? Se entiende mi pregunta???


Espero su ayuda!!!
  #2 (permalink)  
Antiguo 06/12/2004, 16:12
Avatar de hugo777  
Fecha de Ingreso: enero-2002
Ubicación: Lima, Perú
Mensajes: 757
Antigüedad: 22 años, 3 meses
Puntos: 1
Hola, la transaccionanbilidad en los EJB se pueden manejar de dos formas: Por el container (CMT) y manualmente por el usuario (BMT). De estas dos, la forma más recomendada es que la maneje el container, aprovechando de paso las mejores carácterísticas que implementan para esto los EJB Container de los servidores de aplicaciones.

La configuración se realiza en los descriptores del EJB, más especificamente en el ejb-jar.xml . Es ahí donde uno le indica los métodos del EJB que tipo de transaccionabilidad tendrán. Existen hasta 6 manejos distintos para que el container controle la transacción para un método del EJB.

He estado buscando links en español, pero no logró encontrar, ahora en inglés te puede servir:

http://sybooks.sybase.com/onlinebook...kTextView/2128
http://developer.novell.com/tech/845.html
http://www.redhat.com/docs/manuals/r...ansaction.html

También, lo que podrías buscar por el tipo de servidor de aplicaciones que estas usando, y en base a ese buscar la información que requieres.

Espero te ayude,
__________________
Saludos,

H@C..
  #3 (permalink)  
Antiguo 07/12/2004, 09:27
 
Fecha de Ingreso: enero-2004
Mensajes: 144
Antigüedad: 20 años, 2 meses
Puntos: 0
Muy buenos los links, gracias. Según entiendo, por cada método del EJB se indica que tipo de transaccionalidad usa.

Ahora como lo hago para que estos métodos llamen a la base de datos, esto sea transaccional.

Vi como configurar DataSource en :http://www.etse.urv.es/EngInf/assig/sob/l4/guide.htm

pero no se como integrar las llamadas a las base de datos (y q sean transaccionales) con la transaccionalidad de los métodos de los EJB.

necesito ayuda y ojala con manzanitas!!!!

Gracias
  #4 (permalink)  
Antiguo 08/12/2004, 13:13
Avatar de hugo777  
Fecha de Ingreso: enero-2002
Ubicación: Lima, Perú
Mensajes: 757
Antigüedad: 22 años, 3 meses
Puntos: 1
Y que servidore de aplicaciones estan usando? ...
__________________
Saludos,

H@C..
  #5 (permalink)  
Antiguo 08/12/2004, 18:16
 
Fecha de Ingreso: enero-2004
Mensajes: 144
Antigüedad: 20 años, 2 meses
Puntos: 0
Estoy usando JBoss 3.2.5

Última edición por Machine80; 09/12/2004 a las 06:42
  #6 (permalink)  
Antiguo 09/12/2004, 08:30
Avatar de hugo777  
Fecha de Ingreso: enero-2002
Ubicación: Lima, Perú
Mensajes: 757
Antigüedad: 22 años, 3 meses
Puntos: 1
Hola, es distinto el acceso a base de datos desde un EJB, que el manejo de la transaccionabilidad del EJB. Pues no necesitas, especificar un datasource para definir cual será el nivel de transaccionabilidad de los EJB.
Cuando tu le dices a tu EJB, que su transaccionabilidad será manejada por el container, pues, todo se configura en los descriptores: ejb-jar.xml .

Puede darse el caso que tu EJB, no tenga acceso a base de datos, pero sin embargo, si tenga un manejo de transaccionabilidad con cierto nivel configurado para cada metodo. Así tú metodo puede hacer commit y rollback, sin considerar que se esta accediendo a un BD.


El datasource, entra a tallar, cuando tu necesitas acceder a base de datos, y el caso en que un EJB, sí necesita un datasource, es sólo cuando el EJB, es del tipo EJB Entity CMP (container manager persistence).

Los links que te pase en el post anterior, te ilustran como se configura el nivel de transaccionabilidad en un EJB.
__________________
Saludos,

H@C..
  #7 (permalink)  
Antiguo 09/12/2004, 09:19
 
Fecha de Ingreso: enero-2004
Mensajes: 144
Antigüedad: 20 años, 2 meses
Puntos: 0
Ok, muy claro, gracias.

Me quedo claro que las transacciones de lo métodos de EJB son totalmente independientes de las tranasacciones en la base de datos.

Pero mi duda es:

Estoy usando EJB session stateless y por ejemplo tengo un método
miMetodo(Strign var1, String var2, etc) en xEJB el cual llama a 2 EJB:
yEJB.metodo1(var1) y
zEJB.metodo2(var2)

Estos dos métodos insertan datos a la base de datos. Ahora, toda esa operacion en la base de datos debe ser transaccional.

Puedo ocupar la transaccionalidad de los EJB para manejar eso???, o (la solución que se me ocurrio recién) crear un Connection "conn" setAutoCommit(false) y capturar exepciones en "miMetodo" y pasar "conn" como parámetro a todos los métodos. Estos métodos debe ser throws Exception. Luego si ocurre algún problema, la expection es capturada por "miMetodo" y hace rollback, sino commit. Y según yo queda transaccional.

O existe una solución estandarizada para este problema???
  #8 (permalink)  
Antiguo 09/12/2004, 23:21
Avatar de hugo777  
Fecha de Ingreso: enero-2002
Ubicación: Lima, Perú
Mensajes: 757
Antigüedad: 22 años, 3 meses
Puntos: 1
Asi es, puedes utilizar la transaccionabilidad de los EJB, que se configura en los descriptores para asignar un nivel de transaccion a tu mètodo. Es decir, si alguno de los dos mètodos falla, entonces, todos los cambios hechos por los mètodos que se hayan ejecutado se cancelan, pues se harà un rollback transaction en el mètodo del EJB.

Claro que tambien, si deseas puedes manejar tu mismo la transaccionabilidad, pero, ahi ya no serìa manejada por el container, sino manejada por el bean (osea por el usuario).

No interesa el tipo de EJB, para aplicar la transaccionbilidad, puede ser stateless, statefull, entities o message driven bean.
__________________
Saludos,

H@C..
  #9 (permalink)  
Antiguo 11/12/2004, 16:16
 
Fecha de Ingreso: enero-2004
Mensajes: 144
Antigüedad: 20 años, 2 meses
Puntos: 0
Me impactó la utilidad del EJB para manejar transacciones, pero me surgió un problema.

Ok, hice algunas pruebas y dentro de un metodo "required" en donde tengo inserts a la base de datos no pude poner ni s.setAutocommit(false), conn.commit() o conn.rollback() (me imagino q eso lo maneja el EJB) y me parece excelente.

Ahora entre las pruebas que hice fue hacer un insert correcto y un insert incorrecto en este método. El insert correcto lo hizo y cuando se fue a ejecutar el insert incorrecto me arrojó SQLException, pero me conservó el primer insert.

Que puede ser???
Debo hacer yo (el programador) el rollback sobre las operaciones sobre la base de datos o es trabajo del container???



En las pruebas que hice con sentencias correctas, la transaccionalidad la maneja bien.
  #10 (permalink)  
Antiguo 11/12/2004, 19:31
Avatar de hugo777  
Fecha de Ingreso: enero-2002
Ubicación: Lima, Perú
Mensajes: 757
Antigüedad: 22 años, 3 meses
Puntos: 1
HOla, cuando se esta trabajando con EJBs que manejen la transaccionabilidad por el EJB container, tienes que asegurarte que se aborte una transaccion a travès del método setRollbackOnly(true).

Es decir, capturas las excepciones que pueden ocurrir dentro del mètodo y cuando sucedan en el bloque catch, llamas al setRollbackOnly. Eso debe funcionar.

Más info en la pàgina 305 del documento Mastering EJB capìtulo de transacciones, en:

http://www.theserverside.com/books/wiley/masteringEJB/
__________________
Saludos,

H@C..
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 06:08.