9
votes

Comment prévenir "la transaction locale a déjà 1 exception de ressource non XA"?

J'utilise 2 PU dans l'EJB apatride et chacun d'entre eux est invoqué sur une méthode:

@PersistenceContext(unitName="PU")
private EntityManager em;
@PersistenceContext(unitName="PU2")
private EntityManager em2;

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW )
public void getCandidates(final Integer eventId) throws ControllerException {
    ElectionEvent electionEvent = em.find(ElectionEvent.class, eventId);
    ...
    Person person = getPerson(candidate.getLogin());
    ...
}

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW )
private Person getPerson(String login) throws ControllerException {
    Person person = em2.find(Person.class, login);
    return person;
}


3 Réponses :


5
votes

J'utilise 2 PU dans l'EJB apatride et chacun d'eux est invoqué sur une méthode

En effet. Mais vous appelez la deuxième méthode à partir du premier à partir de la première fois que vous faites une transaction distribuée et que vous devez utiliser XA pour cela (au moins pour l'une des ressources étant donné que Glassfish prend en charge le Optimisation du dernier agent permettant d'impliquer une ressource non XA). En d'autres termes, définir l'une de vos données de données en tant que xadatasource est la voie à suivre.

Si vous obtenez une erreur lorsque vous le faites, veuillez ajouter des détails sur ce que vous avez fait exactement et la standingTrace.


1 commentaires

Merci, je vais le poster dès que possible, mais dans le méthante, est-il un moyen de spécifier XadataSource à Persistence.xml? Je ne trouvais pas ça nulle part et chaque fois que je déploie via NetBeans, le réglage de poisson-verre dans le pool de connexion est revenu à une source de données simple.



7
votes

OK,

C'est résolu maintenant. Je partagerai au cas où quelqu'un a été abordé par quelqu'un de même chose. Un problème total était avec le déploiement des NetBeans. Ils écrasent les réglages dans le pool de connexions de Glassfish et lorsque vous les définissez correctement au moment de l'exécution, vous avez des éléments stupides de NPE ou de mot de passe manquants. L'endroit pour éditer c'est Sun-Resources.xml . L'élément XML a attributs DataSource-ClassName et Type RS. Ce qui doit être fait dans le cas de la base de données Derby est le suivant: xxx

fonctionne comme un charme maintenant.


0 commentaires

2
votes

Lorsque vous appelez la deuxième méthode à partir du premier, ce n'est pas un appel de méthode EJB. Il le traite comme un appel de méthode régulier et ne regarde pas @TransactionAttribute . Si vous souhaitez un appel à la même ejb, vous pouvez injecter le sessionContext et appelez getBusinessObject . Appelez ensuite la méthode sur l'EJB renvoyé.


0 commentaires