Che cos'è JNDI? Qual è il suo uso di base? Quando viene usato?


Risposte:


242

Che cos'è JNDI?

Sta per Java Naming and Directory Interface .

Qual è il suo uso di base?

JNDI consente alle applicazioni distribuite di cercare servizi in modo astratto, indipendente dalle risorse.

Quando viene utilizzato?

Il caso d'uso più comune è impostare un pool di connessioni al database su un server delle applicazioni Java EE. Qualsiasi applicazione distribuita su quel server può ottenere l'accesso alle connessioni necessarie utilizzando il nome JNDI java:comp/env/FooBarPoolsenza dover conoscere i dettagli sulla connessione.

Questo ha diversi vantaggi:

  1. Se si dispone di una sequenza di distribuzione in cui le app si spostano dagli devl->int->test->prodambienti, è possibile utilizzare lo stesso nome JNDI in ciascun ambiente e nascondere il database effettivo utilizzato. Le applicazioni non devono cambiare mentre migrano da un ambiente all'altro.
  2. È possibile ridurre al minimo il numero di persone che devono conoscere le credenziali per accedere a un database di produzione. Solo il server dell'app Java EE deve sapere se si utilizza JNDI.

9
quindi questa è fondamentalmente un'alternativa più sicura ad avere un file delle proprietà con le informazioni sulla tua connessione jdbc?
grinch

4
@grinch: essenzialmente sì. È più sicuro e più standardizzato, quindi semplifica la distribuzione (non è necessario indovinare quale deve essere il nome del file delle proprietà, ecc.).
sleske,

Qual è la differenza tra l'utilizzo delle variabili di ambiente e JNDI? È un concetto simile?
skryvets,

101

Che cos'è JNDI?

Java Naming and Directory Interface TM (JNDI) è un'API (Application Programming Interface) che fornisce funzionalità di denominazione e directory alle applicazioni scritte utilizzando il linguaggio di programmazione Java TM . È definito come indipendente da qualsiasi implementazione specifica del servizio di directory. In questo modo è possibile accedere a una varietà di directory (nuove, emergenti e già distribuite) in modo comune.

Qual è il suo uso di base?

La maggior parte è trattata nella risposta sopra, ma vorrei fornire qui un'architettura in modo che sopra abbia più senso.

inserisci qui la descrizione dell'immagine

Per utilizzare JNDI, è necessario disporre delle classi JNDI e di uno o più fornitori di servizi. Java 2 SDK, v1.3 include tre provider di servizi per i seguenti servizi di denominazione / directory:

  1. LDAP (Lightweight Directory Access Protocol)
  2. Servizio di nomi Common Object Request Broker Architecture (CORBA) Common Object Services (COS)
  3. Registro Java Remote Method Invocation (RMI)

Quindi, fondamentalmente, crei oggetti e li registri sui servizi di directory che puoi successivamente cercare ed eseguire operazioni.


30

JNDI in parole povere è fondamentalmente un'interfaccia per essere in grado di ottenere istanze di risorse interne / esterne come

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

o qualsiasi altro tipo definito da un adattatore di risorse JCA. Fornisce una sintassi per poter creare l'accesso sia interno che esterno. cioè (comp / env in questo caso significa dove componente / ambiente, ci sono molte altre sintassi):

jndiContext.lookup("java:comp/env/persistence/customerDB");

1
Questa è solo una parte dell'immagine. JNDI ti consente di cercare oggetti Java: possono essere risorse come una DataSource o qualcos'altro, persino semplici java.lang.Stringper le informazioni di configurazione.
sleske,

3
@sleske Ti suggerisco di fare la tua risposta allora.
Ced

14

Panoramica di JNDI

JNDI è un'API specificata nella tecnologia Java che fornisce funzionalità di denominazione e directory alle applicazioni scritte nel linguaggio di programmazione Java. È progettato appositamente per la piattaforma Java utilizzando il modello a oggetti di Java. Utilizzando JNDI, le applicazioni basate sulla tecnologia Java possono archiviare e recuperare oggetti Java di qualsiasi tipo. Inoltre, JNDI fornisce metodi per eseguire operazioni di directory standard, come associare attributi con oggetti e cercare oggetti usando i loro attributi.

JNDI è anche definito indipendentemente da qualsiasi specifica denominazione o implementazione del servizio di directory. Consente alle applicazioni di accedere a servizi di denominazione e directory diversi, possibilmente multipli, utilizzando un'API comune. Diversi fornitori di servizi di denominazione e directory possono essere collegati senza soluzione di continuità dietro questa API comune. Ciò consente alle applicazioni basate sulla tecnologia Java di sfruttare le informazioni in una varietà di servizi di denominazione e directory esistenti, come LDAP, NDS, DNS e NIS (YP), oltre a consentire alle applicazioni di coesistere con software e sistemi legacy.

Utilizzando JNDI come strumento, è possibile creare nuove applicazioni potenti e portatili che non solo sfruttano il modello a oggetti di Java, ma sono anche ben integrate con l'ambiente in cui vengono distribuite.

Riferimento


9

Che cos'è JNDI?

JNDI è l'acronimo di Java Naming and Directory Interface. Viene fornito di serie con J2EE.

Qual è il suo uso di base?

Con questa API, puoi accedere a molti tipi di dati, come oggetti, dispositivi, file di denominazione e servizi di directory, ad es. viene utilizzato da EJB per trovare oggetti remoti. JNDI è progettato per fornire un'interfaccia comune per accedere a servizi esistenti come DNS, NDS, LDAP, CORBA e RMI.

Quando viene utilizzato?

È possibile utilizzare JNDI per eseguire operazioni di denominazione, incluse operazioni di lettura e operazioni per l'aggiornamento dello spazio dei nomi. Le seguenti operazioni sono descritte qui .


7

Un servizio di denominazione associa i nomi agli oggetti e trova gli oggetti in base ai loro nomi (il registro RMI è un buon esempio di servizio di denominazione). JNDI fornisce un'interfaccia comune a molti servizi di denominazione esistenti, come LDAP, DNS.

Senza JNDI, la posizione o le informazioni di accesso delle risorse remote dovrebbero essere codificate nelle applicazioni o rese disponibili in una configurazione. Il mantenimento di queste informazioni è piuttosto noioso e soggetto a errori.


3

Sono solo curioso di sapere perché i documenti ufficiali sono così ignorati che elaborano meticolosamente i dettagli.

Ma se desideri comprendere i casi, fai riferimento alla risposta di Duffymo .

Java Naming and Directory Interface TM (JNDI) è un'API (Application Programming Interface) che fornisce funzionalità di denominazione e directory alle applicazioni scritte utilizzando il linguaggio di programmazione Java TM . È definito come indipendente da qualsiasi implementazione specifica del servizio di directory. Pertanto, è possibile accedere a una varietà di directory - nuove, emergenti e già distribuite - in modo comune.

E la sua architettura

inserisci qui la descrizione dell'immagine

E normalmente come lo usi .


5
I am just curious why the official docs are so ignored which elaborate the details meticulously alreadyForse perché non spiegano in modo sufficiente che le persone normali possono capire?
Skryvets,

1

Userò un esempio per spiegare come JNDI può essere usato per configurare il database senza che nessuno sviluppatore di applicazioni conosca nome utente e password del database.

1) Abbiamo configurato l'origine dati in standalone-full.xml del server JBoss . Inoltre, possiamo configurare anche i dettagli del pool.

 <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>

inserisci qui la descrizione dell'immagine

Ora, questo nome jndi e l'oggetto origine dati associato saranno disponibili per la nostra applicazione.applicazione.

2) È possibile recuperare questo oggetto origine dati utilizzando la classe JndiDataSourceLookup.

inserisci qui la descrizione dell'immagine

Spring istanzerà il bean di origine dati, dopo aver fornito il nome jndi.

Ora, possiamo modificare le dimensioni del pool, il nome utente o la password in base al nostro ambiente o ai requisiti, ma ciò non influirà sull'applicazione.

Nota :cryptedSecurityDomain, dobbiamo configurarlo separatamente nel server JBoss come

<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>

Questo è uno dei casi d'uso. Spero che chiarisca.


0

La migliore spiegazione per me è data qui

Cos'è JNDI

È un'API per fornire l'accesso a un servizio di directory, ovvero un nome di mapping del servizio (stringhe) con oggetti, riferimento a oggetti remoti o dati semplici . Questo si chiama legame. L'insieme di associazioni è chiamato contesto . Le applicazioni utilizzano l'interfaccia JNDI per accedere alle risorse.

Per dirla in parole povere, è come una hashmap con una chiave String e valori Object che rappresentano risorse sul web.

Quali problemi risolve JNDI

Senza JNDI, la posizione o le informazioni di accesso delle risorse remote dovrebbero essere codificate nelle applicazioni o rese disponibili in una configurazione. Il mantenimento di queste informazioni è piuttosto noioso e soggetto a errori.

Se una risorsa è stata trasferita su un altro server, con un altro indirizzo IP, ad esempio, tutte le applicazioni che utilizzano questa risorsa dovrebbero essere aggiornate con queste nuove informazioni. Con JNDI, questo non è necessario. È necessario aggiornare solo l'associazione delle risorse corrispondente. Le applicazioni possono ancora accedervi con il suo nome e il trasferimento è trasparente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.