La Java Naming and Directory Interface (JNDI) es una interfaz de programación (API) que proporciona funcionalidades de nombrado y directorio a las aplicaciones escritas usando Java. Está definido para ser independiente de cualquier implementación de servicio de directorio. Así se puede acceder a una gran variedad de directorios de una forma común.
Sirve para configurar recursos compartidos para aplicaciones java organizándolos por directorio con nombres únicos. Es un servicio de nombres que permite:
Sirve para configurar recursos compartidos para aplicaciones java organizándolos por directorio con nombres únicos. Es un servicio de nombres que permite:
- Asociar nombres con objetos.
- Permitir la búsqueda de un objeto por su nombre.
- LDAP (Lightweight Directory Access Protocol)
- NDS (Novell Directory Service)
- NIS (Network Information Service)
La API JNDI permite escribir código Java que realice operaciones sobre directorios. Es una API uniforme a todos los tipos de servicios de directorios. Es similar a JDBC.
Service Provider Interface (SPI) permite acceder al servicio de directorio específico de cada fabricante. Mapea código JNDI en operaciones específicas de directorios. Es un driver JNDI.
Arquitectura JNDI
Un ejemplo sencillo
Vamos a configurar un pool de conexiones para una base de datos en el lado del servidor. A continuación se muestra cómo se usaría el API JNDI:
String jndiName = "jdbc/<alias>";
//Obtenemos el contexto inicial (dónde comienza el directorio de nombres)
InitialContext ctx = new InitialContext();
//Asignamos el recurso a un objeto de tipo DataSource (Binding)
DataSource ds = (DataSource) ctx.lookup(jndiName);
Connection conn = ds.getConnection();
// hacer algo con la conexión
conn.close();
ctx.close();
El código anterior funcionaría en todas las aplicaciones que tengamos desplegada en nuestro servidor web (en nuestro caso lo que es Tomcat) o servidor de aplicaciones. Se usa en todas las aplicaciones del servidor y solo lo configuramos una vez.
La configuración que hay que realizar en Tomcat es la siguiente:
- Modificar el fichero ../conf/server.xml de Tomcat entre las etiquetas <GlobalNamingResources> y </GlobalNamingResources>
- Modificar el fichero /conf/context.xml entre las etiquetas <Context> y </Context> con lo siguiente:
- Incluir el jar del conector jdbc a la base de datos en la carpeta lib del servidor Tomcat, no del proyecto. Y, muy importante, reiniciar el servidor.
<GlobalNamingResources>
…
<Resource name="jdbc/<alias>"
auth="Container"
type="oracle.jdbc.pool.OracleDataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
factory="oracle.jdbc.pool.OracleDataSourceFactory"
url="jdbc:oracle:thin:@<host>:<port>:<sid>"
[user=<user>]
[password=<password>]
maxActive="20"
maxIdle="10"
maxWait="-1" />
…
</GlobalNamingResources>
Estamos configurando una fuente de datos (dataSource) para poder acceder a una base de datos Oracle. Indicando al servidor que tenemos un recurso. A continuación indicamos a nuestras aplicaciones que pueden hacer uso del recurso definido en el servidor:
<Context>
…
<ResourceLink global="jdbc/<alias>" name="jdbc/<alias>"
type="oracle.jdbc.pool.OracleDataSource"/>
…
</Context>