21 Stimmen

Wie kann ich eine JNDI-Datenquelle von außerhalb eines Webcontainers abrufen?

Ich habe die folgende Umgebung eingerichtet:

  • Java 1.5
  • Sun Anwendungsserver 8.2
  • Oracle 10 XE
  • Streben 2
  • Winterschlaf

Ich bin daran interessiert zu wissen, wie ich Code für einen Java-Client (d.h. außerhalb einer Webanwendung) schreiben kann, der auf die vom Anwendungsserver bereitgestellte JNDI-Datenquelle verweisen kann.

Die Ports für den Sun Application Server sind alle auf die Standardwerte eingestellt. In der Serverkonfiguration gibt es eine JNDI-Datenquelle namens jdbc/xxxx, aber ich habe festgestellt, dass die Hibernate-Konfiguration für die Webanwendung stattdessen den Namen java:comp/env/jdbc/xxxx verwendet.

Die meisten der Beispiele, die ich bisher gesehen habe, beinhalten Code wie

Context ctx = new InitialContext();
ctx.lookup("jdbc/xxxx");

Aber es scheint, dass ich entweder den falschen JNDI-Namen verwende oder eine jndi.properties oder eine andere Konfigurationsdatei konfigurieren muss, um korrekt auf einen Listener zu verweisen? Ich habe appserv-rt.jar vom Sun Application Server, das eine jndi.properties-Datei enthält, aber sie scheint nicht zu helfen.

Es gibt eine ähnliche Frage hier, aber es gibt keinen Code / bezieht sich auf mit iBatis erhalten die JNDI Datasource automatisch: Zugriff auf Datenquellen von außerhalb eines Web-Containers (über JNDI)

20voto

djsumdog Punkte 2227

Ich bin bei genau demselben Problem hängen geblieben. Ich habe eine kleine Anleitung geschrieben. Im Grunde müssen Sie Ihre eigene Implementierung der DataSource-Objekte erstellen und sie zu Ihrem eigenen benutzerdefinierten anfänglichen Kontext hinzufügen. Beispiele für den Quellcode gibt es hier:

Lokale Ausführung von Beans, die Datenquellen des Anwendungsservers verwenden

1 Stimmen

Der Blogbeitrag war äußerst nützlich. Danke!

2voto

Holger Thurow Punkte 654

Versuchen Sie Simple-JNDI. Es bietet Ihnen eine In-Memory-Implementierung eines JNDI-Dienstes und ermöglicht es Ihnen, die JNDI-Umgebung mit Objekten zu füllen, die in Property-Dateien definiert sind. Es gibt auch Unterstützung für das Laden von Datenquellen oder Verbindungspools, die in einer Datei konfiguriert sind.

Um einen Verbindungspool zu erhalten, müssen Sie eine Datei wie diese erstellen:

type=javax.sql.DataSource
driver=com.sybase.jdbc3.jdbc.SybDriver
pool=myDataSource
url=jdbc:sybase:Tds:servername:5000
user=user
password=password

In Ihrer Anwendung können Sie auf den Pool über

Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("path/to/your/connectionPool");

Ich verwende Simple-JNDI schon seit Jahren für diesen Zweck. Aber es wird nicht mehr aktiv weiterentwickelt. Da ich einige Probleme mit gemeinsam genutzten Kontexten (insbesondere bei der Verwendung von Datenquellen) gefunden habe, habe ich mich entschlossen, das ursprüngliche Projekt zu verzweigen und einige neue Funktionen hinzuzufügen. Jetzt gibt es eine 0.13.0. Mehr dazu finden Sie unter https://github.com/h-thurow/Simple-JNDI .

1voto

Will Hartung Punkte 110997

Wenn Sie eine alltägliche Java-Anwendung meinen, die außerhalb des Containers läuft, dann haben Sie Pech gehabt. Sie müssten dann eine eigene JNDI-Implementierung mit einem eigenen Verbindungspool usw. konfigurieren.

Sie können jedoch auch "eigenständige" Java EE-Anwendungen schreiben. Dies sind Anwendungen, die innerhalb des Java EE-Anwendungsclients ausgeführt werden. Im Grunde handelt es sich um eine Anwendung, die bereitgestellt und verpackt wird, dann aber mit einem Launcher ausgeführt wird, der von Ihrem Java EE-Container bereitgestellt wird.

Bei der Ausführung in einer Anwendungs-Client-Umgebung stehen Ihrer Anwendung alle Ressourcen des Anwendungsservers (Verbindungspools, EJBs, Warteschlangen usw.) genauso zur Verfügung, wie wenn der Code auf dem Anwendungsserver bereitgestellt würde.

Hier ist eine Tutorial-Dokumentation für Sun App Server 8.2, einem J2EE 1.4 Container.

Wenn es möglich ist, würde ich ein Upgrade auf Glassfish v2.1 vorschlagen, ein modernerer, besserer Allround-Server, auf dem Ihre Anwendungen problemlos laufen sollten, da er ein Nachkomme von 8.2 ist.

0 Stimmen

Danke für die Idee, eine eigenständige JEE-Anwendung zu schreiben. Das ist eine interessante Alternative, aber ich hatte auf die Möglichkeit gehofft, den App Server als direkten JNDI-Provider zu verwenden, um die Remote-Datenquelle direkt zu erhalten. Die Wahl von Sun App Server 8.2 ist leider auf Legacy-Gründe zurückzuführen, so dass wir nicht auf Glassfish umsteigen können, was definitiv besser wäre.

0voto

pitpod Punkte 369

Was Sie wollen, ist eine Anwendung Client

Alternativ können Sie eine einfache JDBC-Verbindung von Ihrem Standalone-Client aus herstellen, die möglicherweise einfacher zu erstellen ist - allerdings müssen Sie die Verbindungsdetails im Client konfigurieren und können die Einstellungen von Ihrem Anwendungsserver nicht wiederverwenden.

0 Stimmen

Hallo, danke für die Antwort. Die Anwendung Client ist interessant, aber es ist ein wenig zu schwer für meine Bedürfnisse. Die Absicht war, die Verbindung im Web-Server definiert wiederverwenden, um die Konsistenz als ein einziger Punkt, um eine Datenbankverbindung zu erhalten.

0voto

runningboffin Punkte 66

Es mag für Sie etwas spät sein, aber ich habe die Simple-JNDI-Bibliothek seit vielen Jahren für genau den von Ihnen genannten Zweck. Ich bin nicht sicher, ob es alle Optionen hat, die Sie benötigen, aber für meine Kommandozeilenprogramme hat es ausgereicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X