Was ist JNDI? Was ist seine grundlegende Verwendung? Wann wird es verwendet?

284
  • Was ist JNDI ?

  • Was ist seine grundlegende Verwendung?

  • Wann wird es verwendet?

LetsSyncUp
quelle
1
Siehe persönlicher Blog-Beitrag für Definition und Anwendungsfälle: tshikatshikaaa.blogspot.com/2013/01/…
Jérôme Verstrynge

Antworten:

241

Was ist JNDI?

Es steht für Java Naming and Directory Interface .

Was ist seine grundlegende Verwendung?

Mit JNDI können verteilte Anwendungen Dienste abstrakt und ressourcenunabhängig nachschlagen.

Wann wird es verwendet?

Der häufigste Anwendungsfall ist das Einrichten eines Datenbankverbindungspools auf einem Java EE-Anwendungsserver. Jede Anwendung, die auf diesem Server bereitgestellt wird, kann über den JNDI-Namen auf die benötigten Verbindungen zugreifen, java:comp/env/FooBarPoolohne die Details der Verbindung kennen zu müssen.

Dies hat mehrere Vorteile:

  1. Wenn Sie eine Bereitstellungssequenz haben, von der aus Apps verschoben werden devl->int->test->prod Umgebungen werden, können Sie in jeder Umgebung denselben JNDI-Namen verwenden und die tatsächlich verwendete Datenbank ausblenden. Anwendungen müssen sich nicht ändern, wenn sie zwischen Umgebungen migrieren.
  2. Sie können die Anzahl der Personen minimieren, die die Anmeldeinformationen für den Zugriff auf eine Produktionsdatenbank kennen müssen. Nur der Java EE-App-Server muss wissen, ob Sie JNDI verwenden.
Duffymo
quelle
9
Dies ist also im Grunde eine sicherere Alternative zu einer Eigenschaftendatei mit Ihren JDBC-Verbindungsinformationen.
grinch
4
@grinch: Im Wesentlichen ja. Es ist sicherer und standardisierter und erleichtert somit die Bereitstellung (Sie müssen nicht raten, wie der Name der Eigenschaftendatei lauten muss usw.).
Sleske
Was ist dann der Unterschied zwischen der Verwendung von Umgebungsvariablen und JNDI? Ist es ein ähnliches Konzept?
Skryvets
100

Was ist JNDI?

Die Java Naming and Directory Interface TM (JNDI) ist eine Anwendungsprogrammierschnittstelle (API), die Anwendungen, die mit der Programmiersprache Java TM geschrieben wurden, Namens- und Verzeichnisfunktionen bietet . Es ist so definiert, dass es unabhängig von einer bestimmten Verzeichnisdienstimplementierung ist. Auf eine Vielzahl von Verzeichnissen (neu, neu und bereits bereitgestellt) kann auf übliche Weise zugegriffen werden.

Was ist seine grundlegende Verwendung?

Das meiste davon wird in der obigen Antwort behandelt, aber ich möchte hier Architektur bereitstellen, damit oben mehr Sinn ergibt.

Geben Sie hier die Bildbeschreibung ein

Um JNDI verwenden zu können, müssen Sie über die JNDI-Klassen und einen oder mehrere Dienstanbieter verfügen. Das Java 2 SDK, v1.3 enthält drei Dienstanbieter für die folgenden Namens- / Verzeichnisdienste:

  1. LDAP (Lightweight Directory Access Protocol)
  2. Common Object Request Broker Architecture (CORBA) Namensdienst für Common Object Services (COS)
  3. RMI-Registrierung (Java Remote Method Invocation)

Im Grunde genommen erstellen Sie Objekte und registrieren sie in den Verzeichnisdiensten, für die Sie später nachschlagen und Operationen ausführen können.

Aniket Thakur
quelle
30

JNDI ist für Laien im Grunde eine Schnittstelle, um Instanzen interner / externer Ressourcen wie z

  javax.sql.DataSource, 
  javax.jms.Connection-Factory,
  javax.jms.QueueConnectionFactory,
  javax.jms.TopicConnectionFactory,
  javax.mail.Session, java.net.URL,
  javax.resource.cci.ConnectionFactory,

oder ein anderer Typ, der von einem JCA-Ressourcenadapter definiert wird. Es bietet eine Syntax, um internen oder externen Zugriff erstellen zu können. dh (comp / env bedeutet in diesem Fall, dass es bei Komponenten / Umgebungen viele andere Syntaxen gibt):

jndiContext.lookup("java:comp/env/persistence/customerDB");
mel3kings
quelle
1
Dies ist nur ein Teil des Bildes. Mit JNDI können Sie Java-Objekte nachschlagen - dies können Ressourcen wie eine DataSource oder etwas anderes sein, auch nur java.lang.Stringfür Konfigurationsinformationen.
Sleske
3
@sleske Ich schlage vor, du machst dann deine eigene Antwort.
Ced
14

JNDI-Übersicht

JNDI ist eine in der Java-Technologie spezifizierte API, die Anwendungen, die in der Programmiersprache Java geschrieben sind, Namens- und Verzeichnisfunktionen bietet. Es wurde speziell für die Java-Plattform unter Verwendung des Java-Objektmodells entwickelt. Mit JNDI können Anwendungen, die auf Java-Technologie basieren, benannte Java-Objekte eines beliebigen Typs speichern und abrufen. Darüber hinaus bietet JNDI Methoden zum Ausführen von Standardverzeichnisoperationen, z. B. das Zuordnen von Attributen zu Objekten und das Suchen nach Objekten mithilfe ihrer Attribute.

JNDI wird auch unabhängig von einer bestimmten Namens- oder Verzeichnisdienstimplementierung definiert. Es ermöglicht Anwendungen den Zugriff auf verschiedene, möglicherweise mehrere Namens- und Verzeichnisdienste über eine gemeinsame API. Hinter dieser gemeinsamen API können nahtlos verschiedene Namens- und Verzeichnisdienstanbieter eingebunden werden. Auf diese Weise können auf Java-Technologie basierende Anwendungen Informationen in einer Vielzahl vorhandener Namens- und Verzeichnisdienste wie LDAP, NDS, DNS und NIS (YP) nutzen und die Anwendungen können mit älterer Software und Systemen koexistieren.

Mit JNDI als Tool können Sie neue leistungsstarke und portable Anwendungen erstellen, die nicht nur das Objektmodell von Java nutzen, sondern auch gut in die Umgebung integriert sind, in der sie bereitgestellt werden.

Referenz

Chathuranga Chandrasekara
quelle
9

Was ist JNDI?

JNDI steht für Java Naming and Directory Interface. Es wird standardmäßig mit J2EE geliefert.

Was ist seine grundlegende Verwendung?

Mit dieser API können Sie auf viele Arten von Daten zugreifen, z. B. auf Objekte, Geräte, Namensdateien und Verzeichnisdienste, z. Es wird von EJB verwendet, um entfernte Objekte zu finden. JNDI bietet eine gemeinsame Schnittstelle für den Zugriff auf vorhandene Dienste wie DNS, NDS, LDAP, CORBA und RMI.

Wann wird es verwendet?

Mit dem JNDI können Sie Namensvorgänge ausführen, einschließlich Lesevorgänge und Vorgänge zum Aktualisieren des Namespace. Die folgenden Vorgänge werden hier beschrieben .

Sabin Chirila
quelle
7

Ein Namensdienst ordnet Namen Objekten zu und findet Objekte anhand ihrer Vornamen. (Die RMI-Registrierung ist ein gutes Beispiel für einen Namensdienst.) JNDI bietet eine gemeinsame Schnittstelle zu vielen vorhandenen Namensdiensten wie LDAP und DNS.

Ohne JNDI müssten die Standort- oder Zugriffsinformationen von Remote-Ressourcen in Anwendungen fest codiert oder in einer Konfiguration verfügbar gemacht werden. Die Pflege dieser Informationen ist recht mühsam und fehleranfällig.

Chetan Laddha
quelle
3

Ich bin nur neugierig, warum die offiziellen Dokumente so ignoriert werden, dass die Details bereits akribisch ausgearbeitet werden.

Wenn Sie die Fälle verstehen möchten , lesen Sie bitte die Antwort von Duffymo .

Die Java Naming and Directory Interface TM (JNDI) ist eine Anwendungsprogrammierschnittstelle (API), die Anwendungen, die mit der Programmiersprache Java TM geschrieben wurden, Namens- und Verzeichnisfunktionen bietet . Es ist so definiert, dass es unabhängig von einer bestimmten Verzeichnisdienstimplementierung ist. Auf eine Vielzahl von Verzeichnissen - neu, neu und bereits bereitgestellt - kann auf gemeinsame Weise zugegriffen werden.

Und seine Architektur

Geben Sie hier die Bildbeschreibung ein

Und normalerweise, wie Sie es verwenden .

Gehört
quelle
5
I am just curious why the official docs are so ignored which elaborate the details meticulously alreadyVielleicht, weil sie nicht ausreichend erklären, dass normale Leute es verstehen können?
Skryvets
1

Ich werde ein Beispiel verwenden, um zu erklären, wie JNDI zum Konfigurieren der Datenbank verwendet werden kann, ohne dass ein Anwendungsentwickler den Benutzernamen und das Kennwort der Datenbank kennt.

1) Wir haben die Datenquelle in der Standalone-Full.xml des JBoss-Servers konfiguriert . Darüber hinaus können wir auch Pooldetails konfigurieren.

 <datasource jta="false" jndi-name="java:/DEV.DS" pool-name="DEV" enabled="true" use-ccm="false">
                <connection-url>jdbc:oracle:thin:@<IP>:1521:DEV</connection-url>
                <driver-class>oracle.jdbc.OracleDriver</driver-class>
                <driver>oracle</driver>
                <security>
                    <user-name>usname</user-name>
                    <password>pass</password>
                    </security>
                    <security>

 <security-domain>encryptedSecurityDomain</security-domain>
                    </security>

                <validation>
                    <validate-on-match>false</validate-on-match>
                    <background-validation>false</background-validation>
                    <background-validation-millis>1</background-validation-millis>
                </validation>
                <statement>
                    <prepared-statement-cache-size>0</prepared-statement-cache-size>
                    <share-prepared-statements>false</share-prepared-statements>
                    <pool>
                        <min-pool-size>5</min-pool-size>
                        <max-pool-size>10</max-pool-size>
                    </pool>
                </statement>
            </datasource>

Geben Sie hier die Bildbeschreibung ein

Dieser jndi-Name und das zugehörige Datenquellenobjekt stehen jetzt für unsere application.application zur Verfügung.

2) Wir können dieses Datenquellenobjekt mit der JndiDataSourceLookup-Klasse abrufen.

Geben Sie hier die Bildbeschreibung ein

Spring instanziiert die Datenquellen-Bean, nachdem wir den jndi-Namen angegeben haben.

Jetzt können wir die Poolgröße, den Benutzernamen oder das Kennwort gemäß unserer Umgebung oder Anforderung ändern, dies hat jedoch keine Auswirkungen auf die Anwendung.

Hinweis : encryptedSecurityDomain, wir müssen es separat in JBoss Server wie konfigurieren

<security-domain name="encryptedSecurityDomain" cache-type="default">
                    <authentication>
                        <login-module code="org.picketbox.datasource.security.SecureIdentityLoginModule" flag="required">
                            <module-option name="username" value="<usernamefordb>"/>
                            <module-option name="password" value="894c8a6aegc8d028ce169c596d67afd0"/>
                        </login-module>
                    </authentication>
                </security-domain>

Dies ist einer der Anwendungsfälle. Hoffe es klärt.

Yogesh Sanchihar
quelle
0

Die beste Erklärung für mich finden Sie hier

Was ist JNDI?

Es ist eine API zum Bereitstellen des Zugriffs auf einen Verzeichnisdienst, dh einen Dienstzuordnungsnamen (Zeichenfolgen) mit Objekten, Verweise auf entfernte Objekte oder einfache Daten . Dies nennt man Bindung. Der Satz von Bindungen wird als Kontext bezeichnet . Anwendungen verwenden die JNDI-Schnittstelle, um auf Ressourcen zuzugreifen.

Einfach ausgedrückt ist es wie eine Hashmap mit einem String-Schlüssel und Objektwerten, die Ressourcen im Web darstellen.

Welche Probleme löst JNDI?

Ohne JNDI müssten die Standort- oder Zugriffsinformationen von Remote-Ressourcen in Anwendungen fest codiert oder in einer Konfiguration verfügbar gemacht werden. Die Pflege dieser Informationen ist recht mühsam und fehleranfällig.

Wenn eine Ressource auf einen anderen Server mit einer anderen IP-Adresse verschoben wurde, müssten beispielsweise alle Anwendungen, die diese Ressource verwenden, mit diesen neuen Informationen aktualisiert werden. Bei JNDI ist dies nicht erforderlich. Nur die entsprechende Ressourcenbindung muss aktualisiert werden. Anwendungen können weiterhin mit ihrem Namen darauf zugreifen, und die Verlagerung ist transparent.

Xagaffar
quelle