2010-03-26 8 views
17

Ich habe die folgende Umgebung eingerichtet:Wie suche ich eine JNDI-Datenquelle von außerhalb eines Webcontainers?

  • Java 1.5
  • Sun Application Server 8.2
  • 10 Oracle XE
  • Struts 2
  • Hibernate

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

Die Ports für den Sun Application Server haben alle ihre Standardwerte. Es gibt eine JNDI-Datenquelle mit dem Namen jdbc/xxxx in der Serverkonfiguration, 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, ich bin entweder die falsche JNDI-Namen, oder ich brauche eine jndi.properties oder andere Konfigurationsdatei konfigurieren richtig auf einen Listener zeigen? Ich habe appserv-rt.jar vom Sun Application Server, der eine jndi.properties darin hat, aber es scheint nicht zu helfen.

Es gibt eine ähnliche Frage hier, aber es gibt keinen Code/bezieht sich auf mit iBatis den JNDI-Datenquelle erhalten automatisch: Accessing Datasource from Outside A Web Container (through JNDI)

Antwort

16

Ich steckte genau auf dieses Problem. Ich habe ein kleines Tutorial geschrieben. Grundsätzlich müssen Sie Ihre eigene Implementierung der DataSource-Objekte erstellen und sie zu Ihrem eigenen benutzerdefinierten Anfangskontext hinzufügen.Es gibt Quelle Beispiele hier:

Running Beans Locally that use Application Server Data Sources

+0

Der Blogpost war sehr nützlich. Vielen Dank! –

1

Wenn Sie einige generische Java-Anwendung jeden Tag reden laufen außerhalb des Behälters , dann hast du Pech. Effektiv müssten Sie Ihre eigene JNDI-Implementierung mit einem eigenen Verbindungspool konfigurieren usw.

Sie können jedoch Java EE "Standalone" -Anwendungen schreiben. Dies sind Anwendungen, die innerhalb des Java EE-Anwendungsclients ausgeführt werden. Im Grunde ist es eine App, die bereitgestellt und gepackt wird, aber dann mit einem Launcher ausgeführt wird, der von Ihrem Java EE-Container bereitgestellt wird. Wenn innerhalb einer Anwendungsclientumgebung ausgeführt wird, stehen alle Ressourcen des Anwendungsservers (Verbindungspools, EJBs, Warteschlangen usw.) für Ihre App zur Verfügung, genau wie wenn der Code auf dem Anwendungsserver implementiert wäre .

Here ist eine Übungsdokumentation für Sun App Server 8.2, bei dem es sich um einen J2EE 1.4-Container handelt.

Wenn es möglich ist, würde ich dringend vorschlagen, auf Glassfish v2.1 zu aktualisieren, nur ein modernerer, besserer Allround-Server, der Ihre Apps problemlos bereitstellen sollte, da es ein Nachkomme von 8.2 ist.

+0

Danke für die Idee, eine eigenständige JEE-Anwendung zu schreiben. Es ist eine interessante Alternative, aber ich hoffte auf die Möglichkeit, den App-Server als direkten JNDI-Provider zu verwenden, um die entfernte Datenquelle direkt zu erhalten. Die Wahl von Sun App Server 8.2 ist leider aus alten Gründen, so dass wir nicht zu Glassfish wechseln können, was definitiv besser wäre. – masotime

0

Was Sie wollen, ist ein Application Client

Alternativ können Sie eine einfache JDBC-Verbindung von Ihrem Standalone-Client herzustellen, die leichter sein könnte, zu schaffen - aber Sie werden die Verbindungsdaten in dem Client konfiguriert werden müssen und können nicht wiederverwendet werden die Einstellungen von Ihrem Anwendungsserver.

+0

Hallo, danke für die Antwort. Der Applikationsclient ist interessant, aber für meine Bedürfnisse etwas zu schwer. Die Absicht war, die im Web-Server definierte Verbindung wiederzuverwenden, um die Konsistenz als einzigen Punkt zu erhalten, um eine Datenbankverbindung zu erhalten. – masotime

0

Dies könnte ein bisschen spät für Sie, aber ich habe die Simple-JNDI library seit vielen Jahren für den genauen Zweck verwendet man erwähnen. Ich bin nicht sicher, ob es alle Optionen hat, die Sie benötigen, aber es reichte für meine Befehlszeilen-Dienstprogramme aus.

1

Versuchen Sie Simple-JNDI. Sie erhalten eine Im-Memory-Implementierung eines JNDI-Service und können die JNDI-Umgebung mit Objekten füllen, die in Eigenschaftendateien definiert sind. Es gibt auch Unterstützung für das Laden von Datenquellen oder Verbindungspools, die in einer Datei konfiguriert sind.

Um eine Verbindung Pool Sie eine Datei wie diese erstellen müssen erhalten:

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 Sie den Pool über

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

I Simple-JNDI verwendet haved für diesen Zweck zugreifen können seit Jahren. Aber es ist nicht mehr aktiv in der Entwicklung. Da ich einige Probleme im Zusammenhang mit gemeinsam genutzten Kontexten (insbesondere mit Datenquellen) hatte, entschied ich mich, das ursprüngliche Projekt zu verzweigen und einige neue Funktionen hinzuzufügen. Jetzt gibt es eine 0.13.0. Sie können mehr darüber unter https://github.com/h-thurow/Simple-JNDI finden.