J'ai déployé une application héritée sur WebLogic 11g. L'application a le code suivant:
Context context = new InitialContext();
dataSource = (javax.sql.DataSource) context.lookup("Java:myDataSource");
J'ai également une source de données configurée dans WebLogic avec le nom JNDI de:
jdbc/myDataSource
Lorsque le code Java Java s'exécute ci-dessus, j'obtiens l'exception suivante:
javax.naming.NameNotFoundException: While trying to look up /myDataSource in /app/webapp/axis2.war/60105275.; remaining name '/myDataSource'
at weblogic.jndi.internal.BasicNamingNode.newNameNotFoundException(BasicNamingNode.Java:1139)
at weblogic.jndi.internal.ApplicationNamingNode.lookup(ApplicationNamingNode.Java:144)
Je suis assez nouveau sur JNDI, donc ma question est? Où est la déconnexion dans la dénomination? Qu'est-ce que cela signifie lorsqu'une recherche de contexte a un préfixe "Java:"?
Merci!
Vous devriez pouvoir simplement faire ceci:
Context context = new InitialContext();
dataSource = (javax.sql.DataSource) context.lookup("jdbc/myDataSource");
Si vous le recherchez à partir d'une destination distante, vous devez utiliser la fabrique de contexte initial WL comme ceci:
Hashtable<String, String> h = new Hashtable<String, String>(7);
h.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
h.put(Context.PROVIDER_URL, pURL); //For example "t3://127.0.0.1:7001"
h.put(Context.SECURITY_PRINCIPAL, pUsername);
h.put(Context.SECURITY_CREDENTIALS, pPassword);
InitialContext context = new InitialContext(h);
dataSource = (javax.sql.DataSource) context.lookup("jdbc/myDataSource");
Java
est l'espace de noms JNDI racine pour les ressources. L'extrait de code d'origine signifie que le conteneur dans lequel l'application a été initialement déployée n'a appliqué aucun espace de noms supplémentaire au contexte JNDI que vous avez récupéré (à titre d'exemple, Tomcat ajoute automatiquement toutes les ressources à l'espace de noms comp/env
, Donc vous devrez faire dataSource = (javax.sql.DataSource) context.lookup("Java:comp/env/jdbc/myDataSource");
si le nom de référence de la ressource est jdbc/myDataSource
).
Pour éviter d'avoir à changer votre code hérité, je pense que si vous enregistrez la source de données avec le nom myDataSource
(supprimez le jdbc/
), Ça devrait aller. Faites-moi savoir si cela fonctionne.
Je viens de mettre à jour l'application Weblogic 8 héritée pour utiliser une source de données au lieu d'une chaîne JDBC codée en dur. Le nom JNDI de la source de données sur l'onglet de configuration dans l'administrateur Weblogic a montré: "weblogic.jdbc.ESdatasource", voici deux méthodes qui ont fonctionné:
Context ctx = new InitialContext();
DataSource dataSource;
try {
dataSource = (DataSource) ctx.lookup("weblogic.jdbc.ESdatasource");
response.getWriter().println("A " +dataSource);
}catch(Exception e) {
response.getWriter().println("A " + e.getMessage() + e.getCause());
}
//or
try {
dataSource = (DataSource) ctx.lookup("weblogic/jdbc/ESdatasource");
response.getWriter().println("F "+dataSource);
}catch(Exception e) {
response.getWriter().println("F " + e.getMessage() + e.getCause());
}
//use your datasource
conn = datasource.getConnection();
C'est tout le monde. Aucun mot de passe et fabrique de contexte initial nécessaires depuis l'intérieur de l'application Weblogic.
J'ai eu un problème similaire à celui-ci. Il a été résolu en supprimant le Java:comp/env/
préfixe et utilisation de jdbc/myDataSource
dans la recherche de contexte. Tout comme quelqu'un l'a souligné dans les commentaires.