2010-07-02 18 views
4

Je travaille dans WebSphere Application Server 7, JDK 1.6 et Oracle 11g.Ressource DATASOURCE annulée dans le nettoyage de LocalTransactionContainment

Je reçois toujours cette erreur lors de l'utilisation d'un ejb.

[01/07/10 17: 12: 28: 770 BOT] 00000013 LocalTranCoor W WLTC0033W: ressource jdbc/oraDS11 roulé avant le nettoyage de LocalTransactionContainment. [01.07.10 17: 12: 28: 773 BOT] 00000013 LocalTranCoor W WLTC0032W: plus une ou ressources de transactions locales ont été annulées lors du nettoyage d'une LocalTransactionContainment.

Voici comment obtenir la connexion à partir de la source de données dans WAS.

javax.sql.DataSource ds = (javax.sql.DataSource) naming.lookup("DataSource"); 
conn= ds.getConnection(); 

Toute aide sera appréciée ...

Répondre

5

Dans le message d'erreur, vous êtes en train de faire un travail dans une transaction locale et pas commettre. Le travail non validé est annulé par le conteneur à la fin de la méthode (par défaut).

Cette réponse à Datasource rollback in WAS6.0 résume tout cela plutôt bien et comme il n'y a pas de réel intérêt à le paraphraser, je le cite ci-dessous.

A LocalTransactionContainment est ce que vous obtenez en l'absence d'une transaction globale (XA). Le message indique que vous avez effectué un travail de transaction locale dans le cadre de la zone de confinement (méthode ou activité session), puis que n'a pas validé. Le comportement par défaut (contrôlé par l'action non résolue ) consiste à restaurer n'importe quel travail non-validé à la fin de la portée . Vous avez plusieurs options:

  • explicitement la transaction locale

    connection.commit(); // after the work has been performed 
    
  • Changer la source de données à utiliser validation automatique-

    connection.setAutoCommit(true); // 
    

    avant que la connexion est utilisée

  • Placez le travail dans une transaction globale

    Context ic = new InitialContext(); 
    UserTransaction ut = 
    (UserTransaction) ic.lookup("java:comp/UserTransaction"); 
    ut.begin(); 
    // use connection here 
    ut.commit(); 
    
  • Modifier la non résolue d'action en vue de commettre
    Sélectionnez l'onglet « servlets » sur l'éditeur de descripteur de déploiement et puis sélectionnez le servlet en question. Sous 'Extensions WebSphere', puis 'Transaction locale', définissez 'Action non résolue' sur 'Valider' à partir du menu déroulant.

Je vous suggère de commettre le travail explicitement (et lire toute la réponse).

+0

erm .. J'ai changé l'action non-résolue, de ne pas commuter (par défaut) ... et aussi, ce que je fais est une sélection simple ... je n'ai pas à faire de commit après sélection. Le message apparaît après une sélection .. –

+1

@Garis Vous devez valider après un select (comme mentionné dans le lien): * chaque connexion ouverte doit être validée (ou rolledback) explicitement avant la fermeture. Même si tout ce que vous avez fait avec cette connexion est une requête SELECT. * –

1

Cette exception se produit lorsque la table est verrouillée, vous avez donc verrouillé votre table dans la base de données, libérez ce verrou et validez les modifications que vous avez effectuées.