¿Qué es el JNDI? ¿Cuál es su uso básico? Cuando se usa

Respuestas:

241

¿Qué es el JNDI?

Significa Java Naming and Directory Interface .

¿Cuál es su uso básico?

JNDI permite que las aplicaciones distribuidas busquen servicios de una manera abstracta e independiente de los recursos.

Cuando se usa

El caso de uso más común es configurar un grupo de conexión de base de datos en un servidor de aplicaciones Java EE. Cualquier aplicación que se implemente en ese servidor puede obtener acceso a las conexiones que necesita utilizando el nombre JNDI java:comp/env/FooBarPoolsin tener que conocer los detalles sobre la conexión.

Esto tiene varias ventajas:

  1. Si tiene una secuencia de implementación donde las aplicaciones se mueven de los devl->int->test->prodentornos, puede usar el mismo nombre JNDI en cada entorno y ocultar la base de datos real que se está utilizando. Las aplicaciones no tienen que cambiar a medida que migran entre entornos.
  2. Puede minimizar la cantidad de personas que necesitan conocer las credenciales para acceder a una base de datos de producción. Solo el servidor de aplicaciones Java EE necesita saber si usa JNDI.
duffymo
fuente
9
Entonces, ¿esta es básicamente una alternativa más segura a tener un archivo de propiedades con su información de conexión jdbc?
grinch
44
@grinch: Básicamente sí. Es más seguro y más estandarizado, lo que facilita la implementación (no es necesario adivinar cuál debe ser el nombre del archivo de propiedades, etc.).
sleske
¿Cuál es entonces la diferencia entre usar variables de entorno y JNDI? ¿Es un concepto similar?
skryvets
100

¿Qué es el JNDI?

Java Naming and Directory Interface TM (JNDI) es una interfaz de programación de aplicaciones (API) que proporciona funciones de nomenclatura y directorio a aplicaciones escritas usando el lenguaje de programación Java TM . Se define para ser independiente de cualquier implementación específica del servicio de directorio. Por lo tanto, se puede acceder a una variedad de directorios (nuevos, emergentes y ya implementados) de una manera común.

¿Cuál es su uso básico?

La mayor parte se trata en la respuesta anterior, pero me gustaría proporcionar arquitectura aquí para que lo anterior tenga más sentido.

ingrese la descripción de la imagen aquí

Para usar el JNDI, debe tener las clases JNDI y uno o más proveedores de servicios. Java 2 SDK, v1.3 incluye tres proveedores de servicios para los siguientes servicios de nomenclatura / directorio:

  1. Protocolo ligero de acceso a directorios (LDAP)
  2. Servicio de nombres de Common Object Request Broker Architecture (CORBA) Servicios de objetos comunes (COS)
  3. Registro de invocación de método remoto (RMI) de Java

Entonces, básicamente, crea objetos y los registra en los servicios de directorio en los que luego puede buscar y ejecutar operaciones.

Aniket Thakur
fuente
30

JNDI en términos simples es básicamente una interfaz para poder obtener instancias de recursos internos / externos como

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

o cualquier otro tipo definido por un adaptador de recursos JCA. Proporciona una sintaxis para poder crear acceso ya sea interno o externo. es decir (comp / env en este caso significa donde componente / entorno, hay muchas otras sintaxis):

jndiContext.lookup("java:comp/env/persistence/customerDB");
mel3kings
fuente
1
Esto es solo una parte de la imagen. JNDI le permite buscar objetos Java: pueden ser recursos como un DataSource u otra cosa, incluso simples java.lang.Stringpara obtener información de configuración.
sleske
3
@sleske Te sugiero que hagas tu propia respuesta entonces.
Ced
14

Descripción general de JNDI

JNDI es una API especificada en tecnología Java que proporciona funciones de nomenclatura y directorio a aplicaciones escritas en el lenguaje de programación Java. Está diseñado especialmente para la plataforma Java utilizando el modelo de objetos de Java. Usando JNDI, las aplicaciones basadas en tecnología Java pueden almacenar y recuperar objetos Java de cualquier tipo. Además, JNDI proporciona métodos para realizar operaciones de directorio estándar, como asociar atributos con objetos y buscar objetos utilizando sus atributos.

JNDI también se define independientemente de cualquier implementación específica de nombres o servicios de directorio. Permite que las aplicaciones accedan a servicios de directorio y nombres diferentes, posiblemente múltiples, utilizando una API común. Se pueden conectar diferentes proveedores de servicios de nomenclatura y directorio detrás de esta API común. Esto permite que las aplicaciones basadas en tecnología Java aprovechen la información en una variedad de servicios de nomenclatura y directorio existentes, como LDAP, NDS, DNS y NIS (YP), además de permitir que las aplicaciones coexistan con software y sistemas heredados.

Utilizando JNDI como herramienta, puede crear nuevas aplicaciones potentes y portátiles que no solo aprovechan el modelo de objetos de Java, sino que también están bien integradas con el entorno en el que se implementan.

Referencia

Chathuranga Chandrasekara
fuente
9

¿Qué es el JNDI?

JNDI significa Java Naming and Directory Interface. Viene de serie con J2EE.

¿Cuál es su uso básico?

Con esta API, puede acceder a muchos tipos de datos, como objetos, dispositivos, archivos de nombres y servicios de directorio, por ejemplo. EJB lo utiliza para buscar objetos remotos. JNDI está diseñado para proporcionar una interfaz común para acceder a servicios existentes como DNS, NDS, LDAP, CORBA y RMI.

Cuando se usa

Puede usar el JNDI para realizar operaciones de nomenclatura, incluidas operaciones de lectura y operaciones para actualizar el espacio de nombres. Las siguientes operaciones se describen aquí .

Sabin Chirila
fuente
7

Un servicio de nombres asocia nombres con objetos y encuentra objetos basados ​​en sus nombres (el registro RMI es un buen ejemplo de un servicio de nombres). JNDI proporciona una interfaz común para muchos servicios de nombres existentes, como LDAP, DNS.

Sin JNDI, la ubicación o la información de acceso de los recursos remotos tendría que estar codificada en las aplicaciones o estar disponible en una configuración. Mantener esta información es bastante tedioso y propenso a errores.

Chetan Laddha
fuente
3

Tengo curiosidad por saber por qué los documentos oficiales son tan ignorados que elaboran los detalles meticulosamente ya.

Pero si desea comprender los casos, consulte la respuesta de duffymo .

Java Naming and Directory Interface TM (JNDI) es una interfaz de programación de aplicaciones (API) que proporciona funciones de nomenclatura y directorio a aplicaciones escritas usando el lenguaje de programación Java TM . Se define para ser independiente de cualquier implementación específica del servicio de directorio. Por lo tanto, se puede acceder a una variedad de directorios, nuevos, emergentes y ya implementados, de una manera común.

Y su arquitectura

ingrese la descripción de la imagen aquí

Y normalmente cómo lo usas .

Hearen
fuente
55
I am just curious why the official docs are so ignored which elaborate the details meticulously already¿Tal vez porque no explican de manera suficiente que la gente común pueda entender?
skryvets
1

Usaré un ejemplo para explicar cómo se puede usar JNDI para configurar la base de datos sin que ningún desarrollador de aplicaciones sepa el nombre de usuario y la contraseña de la base de datos.

1) Hemos configurado la fuente de datos en standalone-full.xml del servidor JBoss . Además, también podemos configurar los detalles del grupo.

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

ingrese la descripción de la imagen aquí

Ahora, este nombre jndi y su objeto de origen de datos asociado estarán disponibles para nuestra aplicación.

2) Podemos recuperar este objeto fuente de datos usando la clase JndiDataSourceLookup.

ingrese la descripción de la imagen aquí

Spring creará una instancia del bean de origen de datos, después de que proporcionemos el nombre jndi.

Ahora, podemos cambiar el tamaño del grupo, el nombre de usuario o la contraseña según nuestro entorno o requerimiento, pero no afectará la aplicación.

Nota : encryptedSecurityDomain, necesitamos configurarlo por separado en el servidor JBoss como

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

Este es uno de los casos de uso. Espero que aclare.

Yogesh Sanchihar
fuente
0

La mejor explicación para mí se da aquí.

¿Qué es JNDI?

Es una API para proporcionar acceso a un servicio de directorio, es decir, un nombre de asignación de servicio (cadenas) con objetos, referencias a objetos remotos o datos simples . Esto se llama enlace. El conjunto de enlaces se llama contexto . Las aplicaciones usan la interfaz JNDI para acceder a los recursos.

En pocas palabras, es como un hashmap con una clave de cadena y valores de objetos que representan recursos en la web.

¿Qué problemas resuelve JNDI?

Sin JNDI, la ubicación o la información de acceso de los recursos remotos tendría que estar codificada en las aplicaciones o estar disponible en una configuración. Mantener esta información es bastante tedioso y propenso a errores.

Si un recurso se ha reubicado en otro servidor, con otra dirección IP, por ejemplo, todas las aplicaciones que usan este recurso tendrían que actualizarse con esta nueva información. Con JNDI, esto no es necesario. Solo se debe actualizar el enlace de recursos correspondiente. Las aplicaciones aún pueden acceder a él con su nombre y la reubicación es transparente.

xagaffar
fuente