Frage

Die von uns verwendeten Weblogic-Server wurden so konfiguriert, dass sie JNDI-Datenquellennamen wie „appds“ zulassen.

Für die Entwicklung (localhost) führen wir möglicherweise Tomcat aus, und wenn Tomcat im Abschnitt <context> von server.xml deklariert wird, hängt Tomcat JNDI-Datenquellen an „java:comp/env/jdbc/*“ im JNDI-Baum.

Problem: In Weblogic lautet die JNDI-Suche „appds“, während ich in Tomcat anscheinend das formale „java:comp/env/jdbc/appds“ angeben muss.Ich fürchte, die Tomcat-Version ist ein impliziter Standard, aber leider kann ich die Konfiguration von Weblogic nicht ändern ...Das bedeutet also, dass wir am Ende zwei verschiedene Spring-Konfigurationsdateien haben (wir verwenden Spring 2.5), um die verschiedenen Umgebungen zu erleichtern.

Gibt es eine elegante Möglichkeit, dies anzugehen?Kann ich JNDI-Namen direkt in Tomcat nachschlagen?Kann der Frühling einen Namen annehmen und an beiden Orten suchen?Google-Suchanfragen oder Vorschläge wären großartig.

War es hilfreich?

Lösung

JndiLocatorSupport hat eine Immobilie resourceRef.Wenn dies auf „true“ gesetzt ist, wird das Präfix „java:comp/env/“ automatisch vorangestellt.Daher glaube ich, dass es richtig wäre, diesen Parameter beim Wechsel von Tomcat zu Weblogic zu differenzieren.

Andere Tipps

So verwenden Sie einen einzelnen JNDI-Namen in Ihrer Web-App

Ich habe selbst einige Monate lang damit zu kämpfen.Die beste Lösung besteht darin, Ihre Anwendung portierbar zu machen, sodass Sie in Tomcat und Weblogic denselben JNDI-Namen haben.

Um das zu erreichen, ändern Sie Ihre web.xml Und spring-beans.xml um auf einen einzelnen JNDI-Namen zu verweisen und eine Zuordnung zu jedem herstellerspezifischen JNDI-Namen bereitzustellen.

Ich habe jede Datei unten platziert.

Du brauchst:

  • A <resource-ref /> Eintrag in web.xml, damit Ihre App einen einzelnen Namen verwendet
  • Eine Datei WEB-INF/weblogic.xml um Ihren JNDI-Namen der von WebLogic verwalteten Ressource zuzuordnen
  • Eine Datei META-INF/context.xml um Ihren JNDI-Namen der von Tomcat verwalteten Ressource zuzuordnen
    • Dies kann entweder in der Tomcat-Installation oder in Ihrer App erfolgen.

Als allgemeine Regel gilt, dass Sie Ihre JNDI-Namen lieber in Ihrer App haben möchten jdbc/MyDataSource Und jms/ConnFactory und vermeiden Sie es, ihnen voranzustellen java:comp/env/.

Außerdem werden Datenquellen und Verbindungsfabriken am besten vom Container verwaltet und mit JNDI verwendet.Es ist ein Ein häufiger Fehler beim Instanziieren von Datenbankverbindungspools in Ihrer Anwendung.

Frühling

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">

<jee:jndi-lookup jndi-name="jdbc/appds"
                 id="dataSource" />
</beans>

web.xml

<resource-ref>
    <description>My data source</description>
    <res-ref-name>jdbc/appds</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

weblogic.xml

<?xml version="1.0" encoding="UTF-8" ?>
<weblogic-web-app
    xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://xmlns.oracle.com/weblogic/weblogic-web-app http://http://www.oracle.com/technology/weblogic/weblogic-web-app/1.1/weblogic-web-app.xsd">

<resource-description>
    <jndi-name>appds</jndi-name>
    <res-ref-name>jdbc/appds</res-ref-name>
</resource-description>
</weblogic-web-app>

META-INF/context.xml (für Tomcat)

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

Ich habe den Trick mit Tomcat und WebLogic mithilfe von Spring geschafft. Hier ist eine Beschreibung, wie es bei mir funktioniert hat.

Die folgende Konfiguration funktioniert bei mir in Tomcat und Weblogic.

Im Frühling:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
   <!-- This will prepend 'java:comp/env/' for Tomcat, but still fall back to the short name for Weblogic -->
   <property name="resourceRef" value="true" /> 
   <property name="jndiName" value="jdbc/AgriShare" />
</bean>

Erstellen Sie in der Weblogic Admin Console eine JDBC-Ressource mit dem Namen jdbc/AgriShare.Unter „Ziele“ STELLEN SIE SICHER, DASS SIE DIE DATENQUELLE AUF DEN SERVER AUSRICHTEN, AUF DEM SIE IHRE APP BEREITSTELLEN!.Dieser spezielle Punkt hat mich gerade einige Zeit gekostet ...

Wie wäre es mit einer Umgebungsvariablen?Legen Sie Entwicklermaschinen mit dem Tomcat-Namen und Produktionsmaschinen mit dem Weblogic-Namen fest.Sie können Ihren Code sogar so einstellen, dass er einen Standardcode (WebLogic) verwendet, falls die Variable nicht vorhanden ist.

Wie verweisen Sie auf die Ressource im Frühjahr?

Das haben wir für Tomcat:

Kontext:

<Resource name="jms/ConnectionFactory" auth="Container" type="org.apache.activemq.ActiveMQConnectionFactory" description="
JMS Connection Factory"
        factory="org.apache.activemq.jndi.JNDIReferenceFactory" brokerURL="tcp://localhost:61615" brokerName="StandaloneAc
tiveMQBroker"/>

Frühling:

    <beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

<jee:jndi-lookup jndi-name="jms/ConnectionFactory" id="connectionFactory" resource-ref="true"
                         expected-type="javax.jms.ConnectionFactory" lookup-on-startup="false"/>

Der Jee-Namespace stammt aus:

http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd

Das Einrichten von DataSource in der Anwendung selbst ist nicht so verrückt :) Ich würde sagen, das ist sogar obligatorisch, wenn die Anwendung in einem Grid bereitgestellt werden soll.River, GigaSpaces oder ähnliches.

Notiz:Ich sage nicht, dass Verbindungseinstellungen innerhalb von WAR fest codiert werden müssen, sie müssen zur Bereitstellungszeit/Laufzeit bereitgestellt werden.Dies vereinfacht die Verwaltung von Cloud-Instanzen, da diese nur vor Ort konfiguriert werden müssen.

Die Konfiguration von Ressourcen am Container ist nur dann sinnvoll, wenn dort mehrere Anwendungen bereitgestellt werden und diese gemeinsam genutzte Ressourcen nutzen können.

Auch hier gibt es bei Cloud-Bereitstellungen nur eine Anwendung pro Servlet-Container-Instanz.

Auch bei meiner Anwendung gab es ein ähnliches Problem und so habe ich es gelöst:

1) WEB-INF/classes/application.properties enthält den Eintrag:

ds.jndi=java:comp/env/jdbc/tcds

2) Auf der WLS-Maschine habe ich einen Eintrag in der /etc/sysenv Datei:

ds.jndi=wlsds

3) Ich habe Spring so konfiguriert, dass der JNDI in der Eigenschaft gesucht wird ${ds.jndi}, Verwendung einer PropertyPlaceholderConfigurer Bohne mit classpath:application.properties Und file:/etc/sysenv als Standorte.Ich habe auch das eingestellt ignoreResourceNotFound Zu true so dass Entwickler nicht haben müssen /etc/sysenv auf ihren Maschinen.

4) Ich führe einen Integrationstest mit Cargo+Jetty durch und konnte dort eine JNDI-Umgebung nicht richtig einrichten.Ich habe also einen Rückfall BasicDataSource auch mit konfiguriert defaultObject Eigentum von JndiObjectFactoryBean.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top