Frage

Ich habe eine Web-Anwendung, die zwei Einstellungen erforderlich:

  • Ein JDBC-Datenquelle
  • Ein String-Token

Ich möchte dringend der Lage sein, ein .war zu verschiedenen Behältern (Anlegesteg, tomcat, GF3 Minimum) und konfigurieren Sie diese Einstellungen auf Anwendungsebene innerhalb des Behälters zu implementieren.

Mein Code tut dies:

InitialContext ctx = new InitialContext();
Context envCtx = (javax.naming.Context) ctx.lookup("java:comp/env");
token = (String)envCtx.lookup("token");
ds = (DataSource)envCtx.lookup("jdbc/datasource")

Nehmen wir an, ich die Glassfish-Management-Schnittstelle verwendet haben zwei JDBC-Ressourcen zu erstellen: jdbc / Test-Datenquelle und jdbc / Live-Datenquelle, die auf unterschiedliche Kopien des gleichen Schema, auf verschiedenen Servern, unterschiedliche Berechtigungsnachweise usw. Say I verbinden will dies implementieren, mit zu Glassfish und bei der Testdatenquelle zu zeigen, könnte ich dies in meinem sun-web.xml habe:

...
<resource-ref>
  <res-ref-name>jdbc/datasource</res-ref-name>
  <jndi-name>jdbc/test-datasource</jndi-name>
</resource-ref>
...

und

  • sun-web.xml geht innen mein Krieg, nicht wahr?
  • sicher muss es eine Möglichkeit, dies durch die Management-Schnittstelle zu tun

Bin ich versuche auch, das Richtige zu tun? Haben andere Behälter dies nicht leichter machen? Ich würde besonders daran interessiert, wie Anlegesteg 7 Griffe dies, da ich es für die Entwicklung.

Bearbeiten Tomcat hat eine vernünftige Art und Weise dies zu tun:

Erstellen

$TOMCAT_HOME/conf/Catalina/localhost/webapp.xml mit:

<?xml version="1.0" encoding="UTF-8"?>
<Context antiResourceLocking="false" privileged="true">
  <!-- String resource -->
  <Environment name="token" value="value of token" type="java.lang.String" override="false" />

  <!-- Linking to a global resource -->
  <ResourceLink name="jdbc/datasource1" global="jdbc/test" type="javax.sql.DataSource" />

  <!-- Derby -->
  <Resource name="jdbc/datasource2"
    type="javax.sql.DataSource"
    auth="Container"
    driverClassName="org.apache.derby.jdbc.EmbeddedDataSource"
    url="jdbc:derby:test;create=true"
    />

  <!-- H2 -->
  <Resource name="jdbc/datasource3"
    type="javax.sql.DataSource"
    auth="Container"
    driverClassName="org.h2.jdbcx.JdbcDataSource"
    url="jdbc:h2:~/test"
    username="sa"
    password=""
    />
</Context>

Beachten Sie, dass override="false" bedeutet das Gegenteil. Es bedeutet, dass diese Einstellung nicht überschrieben werden kann von web.xml.

Ich mag diesen Ansatz, da die Datei ist Teil der Container Konfiguration nicht den Krieg, aber es ist nicht Teil der globalen Konfiguration; es ist Webapp spezifisch.

Ich glaube, ich ein bisschen mehr von Glasfischen erwarten, da es sollte ein vollständiges Web-Admin-Interface haben, aber ich wäre glücklich mit etwas Gleichwertiges zu dem oben.

Keine korrekte Lösung

Andere Tipps

Für GF v3, können Sie versuchen, die --deploymentplan Option des deploy subcommand von asadmin nutzen. Es wird diskutiert, auf dem Manpage die deploy subcommand .

Wir hatten nur dieses Problem, wenn sie von Tomcat zu Glassfish Migration 3. Hier ist das, was für uns funktioniert.

  • In der Glassfish Administratorkonsole konfigurieren Datenquellen (JDBC-Verbindungspools und Ressourcen) für DEV / TEST / ART / etc.
  • Nehmen Sie Ihre Parameter Einsatzzeit (in unserem Fall Datenbank connect info) in Eigenschaftendatei. Zum Beispiel:
# Database connection properties
dev=jdbc/dbdev
test=jdbc/dbtest
prod=jdbc/dbprod
  • Jeder Web-App auf die gleiche Datenbank Eigenschaften Datei laden kann.
  • Nachschlagen der JDBC-Ressource wie folgt.

import java.sql.Connection;
import javax.sql.DataSource;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

/**
 * @param resourceName the resource name of the connection pool (eg jdbc/dbdev)
 * @return Connection a pooled connection from the data source 
 * associated with resourceName
 * @throws NamingException will be thrown if resource name is not found
 */
 public Connection getDatabaseConnection(String resourceName) 
             throws NamingException, SQLException {
    Context initContext = new InitialContext();
    DataSource pooledDataSource = (DataSource) initContext.lookup(resourceName);
    return pooledDataSource.getConnection();
 }

Beachten Sie, dass dies nicht das übliche zweistufigen Verfahren einen Blick nach oben mit dem Namenskontext beteiligt „java. Comp / env“ Ich habe keine Ahnung, ob das funktioniert in Anwendung andere Behältern als GF3, aber in GF3 gibt es keine Notwendigkeit Ressource Deskriptoren web.xml hinzuzufügen, wenn den obigen Ansatz.

Ich bin sicher, nicht wirklich zu verstehen, die Frage / Problem.

Als Provider-Anwendungskomponente < in eine Standardmethode (Container Agnostiker) / strong> , erklären Sie die Ressource (n) Ihre Applikation in der web.xml.

Bei der Bereitstellungszeit, der Anwendungs Deployer und Administrator soll den Anweisungen von der Anwendungskomponente Provider befolgen, um externe Abhängigkeiten zu lösen (unter anderem) zum Beispiel durch eine Datenquelle auf der Anwendungsserver-Ebene zu schaffen und Abbilden seine realen JNDI Namen des Ressourcennamen von der Anwendung durch die Verwendung eines Anwendungsserver spezifisches Deployment Descriptor (zum Beispiel der sun-web.xml für Glassfish) verwendet. Offensichtlich ist dies ein Container spezifischen Schritt und somit nicht von der Java EE-Spezifikation abgedeckt.

Wenn Sie nun die Datenbank eine Anwendung verwendet ändern möchten, Sie müssen entweder:

  • ändern Sie die Zuordnung in der Anwendungs-Server Deployment Descriptor - oder -
  • Ändern Sie die Konfiguration der vorhandenen Datenquelle, um es auf einer anderen Datenbank verweist.

ein Admin-Interface zu haben wirklich nichts ändern. Wenn ich etwas verpasst haben, zögern Sie nicht, mich zu informieren. Und für den Fall, hat vielleicht einen Blick auf diese vorherige Antwort .

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