Comment obtenir des connexions JDBC obtenue à partir d'une datasource JNDI pour participer à un usertransaction à l'aide de Weblogic 10.3?
Je suis actuellement en train de récupérer à la fois une un usertransaction et une source de données à partir d'un serveur Weblogic 10.3 utilisation de JNDI.
J'ai mis la source de données jusqu'à "Soutenir les Opérations et à l'utilisation de forêts Dernière Ressource"
Mon espoir était que le début d'une UserTranscation puis de la récupération d'une connexion JDBC à partir de la source de données la connexion participer à l'Opération.
Cela ne semble pas être le cas, et mes états d'insertion sont engagés tout de suite et l'annulation de la transaction n'a pas d'effet.
Sont mes hypothèses énoncées ci-dessus correcte?
Quelqu'un peut-il m'indiquer la direction de la documentation ou des échantillons sur comment atteindre cet objectif?
Merci beaucoup à l'avance
Mise à JOUR:
Comme demandé voici un squelette de code, je suis en utilisant:
private void doSomething() {
Connection conn = null;
try {
Hashtable env = new java.util.Hashtable();
env.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
env.put(javax.naming.Context.PROVIDER_URL,"t3://localhost:8080");
InitialContext ctx = InitialContext(env));
UserTransaction transaction = null;
transaction = (UserTransaction) ctx.lookup("java:comp/UserTransaction");
DataSource dataSource = (DataSource) context.lookup("jdbc/xxxxx/DataSource");
conn = dataSource.getConnection();
transaction.begin();
//JDBC code goes here
transaction.commit();
} catch(Exception e) {
//TODO
if (transaction != null) {
try {
transaction.rollback();
} catch (Exception ex) {
//TODO
}
} finally {
if (con != null) {
conn.close
}
}
}
Mise à JOUR 2:
Afin de résoudre ce problème que j'ai eu à faire 2 choses:
- Modifier l'ordre du code, tout d'abord commencer la transaction de l'utilisateur, puis obtenir une connexion à partir de la banque de données (comme l'a souligné Pascal Thivent).
- Modifier la source de données référencée par " "jdbc/xxxxx/DataSource" " pour un XADatasource. C'est parce que j'ai été d'appeler le code à l'intérieur de la transaction de l'utilisateur qui a utilisé une autre source de données qui a déjà été configuré pour prendre en charge LLR et comme l'a souligné Pascal Thivent ci-dessous, vous ne pouvez avoir qu'un LLR source de données participer à un transcation.
J'ai accepté Pascal Thivent la réponse ci-dessous, parce qu'il explique à la fois de ces questions.
OriginalL'auteur lucasweb | 2009-12-18
Vous devez vous connecter pour publier un commentaire.
Oui, vos hypothèses sont correctes et, selon Créer LLR-activé les sources de données JDBC, votre source de données semble correctement configuré.
Pensez-vous obtenir la connexion après le démarrage de la transaction de l'utilisateur? Pouvez-vous montrer votre code ou le pseudo-code?
Mise à JOUR: Comme mentionné dans Considérations relatives à la programmation et Limitations pour les LLR Sources de Données:
Donc, pourriez-vous essayer ceci:
UPDATE2: Pas sûr de comprendre d'où le 2ème connexion est à venir (votre pseudo code n'est pas visible). Toutefois, selon le même Considérations relatives à la programmation et Limitations pour les LLR Sources de Données:
En fait, sans une véritable représentativité de l'exemple, je me sens un peu comme marcher dans le noir 🙂
J'ai essayé ta suggestion. Il en est résulté le message d'erreur suivant: Connexion a déjà été créé dans ce tx contexte pour piscine nommé ABI_DS. Illégal de tenter de créer une connexion à partir d'un autre piscine: AMS_DS Où ABI_DS est la source de données, je suis en utilisant et AMS_DS est une autre source de données configuré pour le même déploiement
OriginalL'auteur Pascal Thivent