Ich habe Probleme mit JNDI, wenn zwei oder mehr Anwendungen auf Tomcat 6 bereitgestellt werden.
Stellen Sie sich das folgende Szenario vor:
Ich habe 2 Webapps, wobei jede web.xml einen JNDI-Parameter enthält
web.xml webapp A:
<env-entry>
<env-entry-name>testEntry</env-entry-name>
<env-entry-value>value A</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
web.xml webapp B:
<env-entry>
<env-entry-name>testEntry</env-entry-name>
<env-entry-value>value B</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
Wenn ich sowohl webapps als auch den Wert für testEntry auslege, geben beide Webapps den Wert A zurück. Es scheinen nur die JNDI-Parameter aus der ersten geladenen web.xml verfügbar zu sein. Nach meinem Verständnis von JNDI enthält jede web.xml webapp-spezifische JNDI-Werte, die nur in ihrem jeweiligen Kontext verfügbar sind. Was mache ich hier falsch / falsch?
Das führt zu meiner nächsten Frage. Wie definieren Sie globale JNDI-Parameter, die in allen Kontexten verfügbar sind? In den Tomcat-Dokumenten habe ich gelesen, dass Sie zu diesem Zweck {CATALINA_HOME} /conf/context.xml verwenden sollten. Die Umgebungseinträge sind jedoch nicht in den Kontexten verfügbar. Wenn Sie sie in {CATALINA_HOME} /conf/web.xml platzieren, sind sie global verfügbar, aber ich bezweifle, dass dies der richtige Weg ist.
Dies ist mein Java-Code, um sie nachzuschlagen:
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
String value = (String)envCtx.lookup("testEntry");
Jede Hilfe wäre willkommen, weil gute Dokumentation über JNDI Narben sind.
BTW,
Sie müssen lediglich context.xml in Ihr META-INF des WebContent-Verzeichnisses innerhalb von war setzen. Der JNDI wird automatisch registriert und der Pool wird beim Laden der Anwendung erstellt.
Nur optional können Sie es in /tomcat6/conf/context.xml einfügen, aber dies erfordert einen Neustart von tomcat nach jeder Konfigurationsänderung.
Hier ist eine gute Konfiguration für meine SQL. Wichtiger Punkt ist logAbandoned (um nicht geschlossene Verbindungen zu erkennen, die durch einen Container aus dem Pool geworfen wurden, weil Ihr Code vergessen hat, sie zu schließen). Für die Validierungsabfrage empfehle ich etwas, um die Anwesenheit Ihrer Datenbanktabelle zu testen.
%Vor%Nun, ich habe das JNDI-Territorium erneut besucht und bin auf einen ähnlichen Anwendungsfall gestoßen. Jetzt ist es mir gelungen.
Wenn Sie auf einfache JNDI-Variablen in einer Webanwendung zugreifen müssen, sollten sie im Element Ihrer Webanwendung definiert werden. Die Syntax für die Definition eines Umgebungseintrags im Kontext unterscheidet sich jedoch von der Syntax, die im Web-Anwendungsdeskriptor verwendet werden soll (siehe meinen ursprünglichen Beitrag). Hier begann meine Verwirrung.
Im Kontext sollte es so aussehen:
Für globale Variablen nehme ich immer noch an, dass {CATALINA_HOME} /conf/context.xml die Stelle ist, an die diese Umgebungseinträge gesetzt werden.
Siehe die Dokumente im Apache: Ссылка
Wie auch immer, danke für Ihre Hilfe!
Aus dem Beispiel, das Sie geben, nehme ich an, dass "Wert A" nur für (und zugänglich von) webapp A definiert werden sollte, und umgekehrt.
Eine Möglichkeit besteht darin, sie als Kontextparameter (nicht als JNDI-Ressourcen) in der META-INF / context.xml-Datei jeder Webanwendung zu definieren, wie in hier . Wenn Sie dies tun, können Sie sicher sein, dass jeder Parameter nur über seine eigene Webanwendung erreichbar ist.