web-dev-qa-db-fra.com

javax.naming.NameNotFoundException: le nom [jdbc / rhwebDB] n'est pas lié dans ce contexte. Impossible de trouver [jdbc]

Je sais qu'il y a beaucoup de questions concernant cette exception, cependant, je crois que j'ai tout essayé pendant plusieurs jours, sans aucune chance pour le moment. Comme il s'agit d'un serveur de production, je ne peux y travailler qu'après minuit :(

J'ai une application Tomcat. Récemment, j'ai mis à jour le pool de connexions, afin d'utiliser le pool de connexions jdbc de Tomcat. Dans ma machine de développement Windows, tout fonctionne bien, mais maintenant que j'essaie de l'implémenter sur mon serveur Linux, je reçois cette exception (voir le titre) chaque fois que mon application essaie de se connecter à MySQL.

J'utilise "Easy Tomcat 7" qui est censé être le même que la version régulière de Tomcat, seulement il est livré avec le logiciel CPanel.

J'ai juste besoin que cette base de données soit disponible pour cette application (pas pour plusieurs applications).

Voici ma Java DB:

public class DBUtil {

static DataSource ds;
static {
    try {
        Context context = new InitialContext();
        ds = (DataSource)context.lookup("Java:comp/env/jdbc/rhwebDB");
    } catch (NamingException e) {
        e.printStackTrace();
        System.out.println("DBUtil.NamingException" + e);
    } catch(Exception e) {
        System.out.println(e);
    }
}

public static Connection getConnection() throws SQLException {
    return ds.getConnection();
}

Ceci est mon fichier context.xml, qui se trouve sur myAppDirectory/META-INF

<?xml version="1.0" encoding="UTF-8"?>

<Context>
<Resource
    name="jdbc/rhwebDB"
    auth="Container"
    type="javax.sql.DataSource"
    factory="org.Apache.Tomcat.jdbc.pool.DataSourceFactory"
    testWhileIdle="true"
    testOnBorrow="true"
    testOnReturn="false"
    validationQuery="SELECT 1"
    validationInterval="30000"
    timeBetweenEvictionRunsMillis="30000"
    maxActive="20"
    minIdle="3"
    maxIdle="15"
    maxWait="10000"
    initialSize="3"
    removeAbandonedTimeout="60"
    removeAbandoned="true"
    logAbandoned="true"
    minEvictableIdleTimeMillis="30000"
    username="dbuser"
    password="dbpwd"
    driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://127.0.0.1:3306/rhmexweb_rhweb"/>
</Context>

Je n'utilise pas de fichiers WAR. Je télécharge simplement des fichiers sur mon serveur et redémarre Tomcat au besoin, ce qui fonctionne normalement très bien.

Dans le cas où cela est également pertinent, le fichier server.xml de Tomcat a ces paramètres pour ce site Web. J'ai également essayé d'ajouter le paramètre copyXML = "true", sans succès jusqu'à présent:

       <Host name="rhweb.net" appBase="webapps">
       <Alias>www.rhweb.net</Alias>
       <Context path="" reloadable="false" docBase="/home/rhweb/public_html" debug="1"/>
       </Host>

Voici la trace de pile complète que j'obtiens lorsque mon application tente d'établir une connexion avec MySQL:

javax.naming.NameNotFoundException: Name [jdbc/rhwebDB] is not bound in this Context. Unable to find [jdbc].
    at org.Apache.naming.NamingContext.lookup(NamingContext.Java:820)
    at org.Apache.naming.NamingContext.lookup(NamingContext.Java:154)
    at org.Apache.naming.NamingContext.lookup(NamingContext.Java:831)
    at org.Apache.naming.NamingContext.lookup(NamingContext.Java:154)
    at org.Apache.naming.NamingContext.lookup(NamingContext.Java:831)
    at org.Apache.naming.NamingContext.lookup(NamingContext.Java:168)
    at org.Apache.naming.SelectorContext.lookup(SelectorContext.Java:158)
    at javax.naming.InitialContext.lookup(InitialContext.Java:415)
    at util.DBUtil.<clinit>(DBUtil.Java:23)
    at Solutio.AdminRH.Entity.ISeguridadAdminDB.verificaUsuario(ISeguridadAdminDB.Java:142)
    at org.Apache.jsp.menu_jsp._jspService(menu_jsp.Java:115)
    at org.Apache.jasper.runtime.HttpJspBase.service(HttpJspBase.Java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:728)
    at org.Apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.Java:432)
    at org.Apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.Java:390)
    at org.Apache.jasper.servlet.JspServlet.service(JspServlet.Java:334)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:728)
    at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:305)
    at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:210)
    at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:222)
    at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:123)
    at org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:502)
    at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:171)
    at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:99)
    at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:118)
    at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:408)
    at org.Apache.coyote.ajp.AjpProcessor.process(AjpProcessor.Java:200)
    at org.Apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.Java:589)
    at org.Apache.Tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.Java:310)
    at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1145)
    at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:615)
    at Java.lang.Thread.run(Thread.Java:745)

J'ai également essayé d'ajouter ces lignes dans le fichier web.xml de mon application (que je n'avais pas eu à inclure dans ma machine Windows)

   <resource-ref>
       <description>MySQL RhWeb Datasource</description>
       <res-ref-name>jdbc/rhwebDB</res-ref-name>
       <res-type>javax.sql.DataSource</res-type>
       <res-auth>Container</res-auth>
   </resource-ref>

Et lorsque j'inclus ces lignes, l'exception que je reçois est celle-ci:

org.Apache.Tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'

Il semble que Tomcat ne trouve pas mon fichier META-INF/context.xml, ou il ne reconnaît pas ce lien:

ds = (DataSource) context.lookup ("Java: comp/env/jdbc/rhwebDB");

Mes versions Linux, Tomcat et JDK sont:

Version 6.8 de CentOS (finale)
Apache Tomcat/7.0.42
Version Java "1.7.0_131"

Je ne sais pas quoi d'autre pourrais-je essayer de résoudre ce problème. Toute aide sera vraiment appréciée

MISE À JOUR

Je n'ai pas encore trouvé de solution. J'ai réalisé quelques problèmes de configuration probables qui peuvent être liés à tout cela:

L'application se trouve ici:

/ accueil/rhmexweb/public_html

Cependant, dans le fichier server.xml de Tomcat, la définition d'hôte de ce site Web est:

<Host name="rhweb.mx" appBase="webapps">
<Context path="" reloadable="false" docBase="/home/rhmexweb/public_html" />
</Host>

La raison pour laquelle ne se trouve pas dans le répertoire webapps, c'est parce que CPanel crée automatiquement chaque compte dans/home/nom-compte/public_html, c'est pourquoi un élément de contexte est nécessaire ici (je suppose). Si je supprime l'intégralité de la balise Context et que j'utilise appBase = "/ home/rhmexweb/public_html", Tomcat ne trouvera pas tous les fichiers et le contenu du dossier WEB-INF (- / home/rhmexweb/public_html/WEB-INF). J'ai mentionné cela parce que j'ai ajouté le paramètre copyXML = "true" juste pour voir où Tomcat essaierait de copier le fichier context.xml, et s'il change de nom, mais il s'avère qu'il y en a deux différents chemins. J'ai d'abord obtenu une exception d'autorisations d'écriture lorsque j'ai inclus ce paramètre pour la première fois, et il essayait de créer un dossier ici:

/ var/lib/easy-Tomcat7/webapps /

Ce chemin ne contient que les dossiers des applications Tomcat par défaut (gestionnaire, exemples et gestionnaire d'hôte)

Le dossier où tous les sites Web sont répertoriés et tous les fichiers jsp compilés sont celui-ci:

/ usr/local/easy/etc/easy-Tomcat7/Catalina /

cependant, dans /usr/local/easy/etc/easy-Tomcat7/Catalina/rhweb.mx/ il n'y a pas de répertoire WEB-INF.

Quoi qu'il en soit, ce que j'aimerais savoir, c'est si le fait d'avoir un élément Context dans la définition d'hôte peut être un problème pour Tomcat afin de trouver le fichier appPath/META-INF/context.xml.

10
Sergio

Je l'ai finalement résolu !!

C'est peut-être une solution de contournement, mais cela fonctionne.

J'ai copié le fichier app-directory/META-INF/context.xml dans:

$ CATALINA_BASE/conf/[enginename]/[hostname]/ context.xml.default (remarquez la partie "par défaut" du nom de fichier )

Comme il est indiqué dans le documentation de Tomcat

Maintenant, je n'ai plus besoin d'ajouter aucune entrée dans le fichier web.xml de mon application, ni un fichier META-INF/context.xml dans mon répertoire d'application (qui est pas situé dans le répertoire Tomcat/webapps)

Tout ce dont j'ai besoin est de mettre un fichier context.xml.default (contenant ses informations DB) dans chaque dossier répertorié dans ce chemin:

$ CATALINA_BASE/conf/[nom du moteur] /

qui sur mon serveur est:

/ usr/local/easy/etc/easy-Tomcat7/Catalina /

donc pour ce site, je l'ai copié sur:

/usr/local/easy/etc/easy-Tomcat7/Catalina/myDomain.com/

Vous remarquerez que mon chemin est différent de celui spécifié dans la documentation de Tomcat, et c'est parce que j'utilise easy-Tomcat 7 de CPanel qui a une structure différente de celle du Tomcat standard. Ce fait a rendu tout plus compliqué lors de la recherche d'une solution, même si elle s'appelle easy - Tomcat.

Pourquoi Tomcat n'a jamais pu lire le fichier /META-INF/context.xml, cela reste un mystère, mais honnêtement, je m'en fous beaucoup car cette méthode est plus facile (un fichier au lieu de deux)

0
Sergio

Il semble qu'il y ait un problème avec le context.xml installer. Essayez server.xml ou /META-INF/context.xml pour voir s'il se comporte différemment.

Vous pouvez essayer de déplacer la configuration vers le server.xml selon documents Tomcat 7 :

<GlobalNamingResources>
  <Resource
    name="jdbc/rhweb_rhwebDB"
    auth="Container"
    type="javax.sql.DataSource"
    ...
  />
</GlobalNamingResources>

lien vers une ressource globale dans le context.xml:

<Context>
  <ResourceLink
    global="jdbc/rhweb_rhwebDB"
    name="jdbc/rhwebDB"
    type="javax.sql.DataSource"
  />
</Context>

puis faites-y référence dans /WEB-INF/web.xml comme vous le faites déjà:

<resource-ref>
  <res-ref-name>jdbc/rhwebDB</res-ref-name>
  <res-ref-type>javax.sql.DataSource</res-ref-type>
  <res-auth>Container</res-auth>
</resource-ref>

Si cela ne fonctionne pas, vous pouvez vérifier quelques autres approches discutées dans cette réponse .

2
Karol Dowbecki