2009-12-06 3 views
0

J'utilise session bean dans mon application et la transaction est contrôlée à la couche EJB seulement. Le problème auquel je fais face est avec un certain engagement. J'utilise la même connexion qu'utilisée par EJB pour l'insérer dans une table, mais si la transaction est validée alors cet insert n'est pas validé dans la base de données .. quelqu'un peut m'aider avec le problème ..est-ce que ejb s'engage sur la connexion?

+0

Votre problème n'est pas clair. Utilisez-vous uniquement des beans session? Utilisez-vous BMT ou CMT? Comment obtenez-vous la connexion dont vous parlez? S'il vous plaît ajouter quelques détails, montrez-nous du code. –

Répondre

2

Je suis pas un expert EJB, je travaille généralement avec des objets Java anciens, mais ...

Votre problème est probablement dû au fait que les EJB ne font pas la gestion des transactions au niveau de la connexion. Ils utilisent le service de transactions Java pour créer des transactions pouvant utiliser plusieurs connexions. Donc, pour que votre insertion fasse partie de la transaction de l'EJB, vous devez obtenir cette transaction du serveur de transaction et faire en sorte que votre insertion fasse partie de cette transaction. Je crois que la façon dont vous faites cela dépend exactement de quel type d'environnement EJB que vous avez (EJB2 ou 3 et ainsi de suite)

Mais si votre dans un environnement EJB et que vous souhaitez insérer des choses dans les mêmes opérations en tant que EJB ne Cela n'a-t-il pas de sens de créer un EJB pour la table que vous voulez insérer et de laisser le serveur d'applications le découvrir?

0

Général, simplifié, la réponse à votre question est oui, Connection.commit() est appelée lorsque EJB est validé. Ce que fait réellement EJB dépend de la façon dont la source de données est définie (transactionnelle ou non) et si l'optimisation de la dernière ressource est autorisée.

J'utilise la même connexion utilisé par EJB

Comment savez-vous? Certains wrappers de connexion (par exemple Weblogic one, si je me souviens bien) n'ont aucun moyen de comparer deux connexions pour l'égalité. Pour ce faire, il faut utiliser une API fournisseur. Donc, même si vous pensez que deux connexions sont identiques, ce n'est pas forcément le cas.

Comment avez-vous obtenu cette connexion? D'où? En fonction de la version EJB, vous devez uniquement obtenir une connexion à partir de la source de données transactionnelle (EJB2) ou utiliser le contexte de persistance et JPA (EJB3). Un code simplifié de ce que vous faites aiderait grandement à pointer votre erreur.