什么是JNDI?它的基本用途是什么?什么时候使用?

时间:2010-12-06 10:55:21

标签: jndi

  • 什么是 JNDI

  • 它的基本用途是什么?

  • 什么时候使用?

9 个答案:

答案 0 :(得分:206)

  

什么是JNDI?

代表Java Naming and Directory Interface

  

它的基本用途是什么?

JNDI允许分布式应用程序以抽象的,与资源无关的方式查找服务。

  

何时使用?

最常见的用例是在Java EE应用程序服务器上设置数据库连接池。部署在该服务器上的任何应用程序都可以使用JNDI名称java:comp/env/FooBarPool访问所需的连接,而无需知道有关连接的详细信息。

这有几个好处:

  1. 如果您有一个部署序列,其中应用程序从devl->int->test->prod环境移动,您可以在每个环境中使用相同的JNDI名称并隐藏正在使用的实际数据库。应用程序不必在环境之间迁移时进行更改。
  2. 您可以最大限度地减少需要知道访问生产数据库凭据的人数。只有Java EE应用服务器需要知道您是否使用JNDI。

答案 1 :(得分:86)

  

什么是JNDI?

Java命名和目录接口 TM (JNDI)是一个应用程序编程接口(API),为使用Java TM 编程语言编写的应用程序提供命名和目录功能。它被定义为独立于任何特定的目录服务实现。因此,可以以通用方式访问各种目录(新的,新兴的和已经部署的)。

  

它的基本用途是什么?

上面的答案中涵盖了大部分内容,但我想在这里提供架构,以便上面的内容更有意义。

enter image description here

要使用JNDI,您必须拥有JNDI类和一个或多个服务提供者。 Java 2 SDK v1.3包含三个用于以下命名/目录服务的服务提供程序:

  1. 轻量级目录访问协议(LDAP)
  2. 公共对象请求代理体系结构(CORBA)公共对象服务(COS)名称服务
  3. Java远程方法调用(RMI)注册表
  4. 所以基本上你创建对象并在目录服务上注册它们,以后你可以查找和执行操作。

答案 2 :(得分:26)

外行人的JNDI基本上是一个能够获取内部/外部资源实例的接口,例如

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

或JCA资源适配器定义的任何其他类型。 它提供了一种语法,能够创建访问权限,无论它们是内部还是外部。即(此实例中的comp / env表示组件/环境,还有许多其他语法):

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

答案 3 :(得分:12)

JNDI概述

  

JNDI是Java中指定的API   提供命名和技术的技术   目录功能   用Java编写的应用程序   编程语言。它是专门设计的   特别是对于Java平台使用   Java的对象模型。使用JNDI,   基于Java技术的应用程序   可以存储和检索命名的Java   任何类型的对象。另外,JNDI   提供执行方法   标准目录操作,例如   将属性与对象相关联   并使用他们的搜索对象   属性。

     

JNDI也是独立定义的   任何特定的命名或目录   服务实施。它使   应用程序访问不同,   可能是多个,命名和   使用通用API的目录服务。   不同的命名和目录服务   提供商可以无缝插入   这个常见的API背后。这使得   基于Java技术的应用程序   利用a中的信息   各种现有的命名和   目录服务,例如LDAP,NDS,   DNS和NIS(YP),以及启用   与...共存的应用程序   传统软件和系统。

     

使用JNDI作为工具,您可以构建   新的功能强大的便携式应用   这不仅利用了Java的优势   对象模型但也是   与环境完美融合   他们被部署的地方。

Reference

答案 4 :(得分:8)

什么是JNDI?

JNDI代表Java命名和目录接口。它标配J2EE。

它的基本用途是什么?

使用此API,您可以访问许多类型的数据,例如对象,设备,命名文件和目录服务,例如。 EJB使用它来查找远程对象。 JNDI旨在提供访问DNS,NDS,LDAP,CORBA和RMI等现有服务的通用接口。

何时使用?

您可以使用JNDI执行命名操作,包括读取操作和更新命名空间的操作。以下操作描述为here

答案 5 :(得分:5)

命名服务将名称与对象相关联,并根据给定的名称查找对象。(RMI注册表是命名服务的一个很好的例子。)JNDI为许多现有的命名服务提供了一个通用接口,例如LDAP,DNS。 / p>

如果没有JNDI,远程资源的位置或访问信息必须在应用程序中进行硬编码或在配置中可用。维护这些信息非常繁琐且容易出错。

答案 6 :(得分:2)

给我最好的解释是here

什么是JNDI

这是一个提供对目录服务的访问的API,即具有对象,引用远程对象或简单数据的服务映射名称(字符串)。这就是所谓的 捆绑。 绑定集称为上下文。应用程序使用JNDI接口访问资源。

简而言之,它就像一个具有String键和代表Web资源的Object值的哈希图。

JNDI解决了什么问题

没有JNDI,远程资源的位置或访问信息必须在应用程序中进行硬编码或在配置中可用。维护这些信息非常繁琐且容易出错。

例如,如果资源已使用其他IP地址重定位在另一台服务器上,则必须使用此新信息来更新使用此资源的所有应用程序。使用JNDI,这不是必需的。仅需要更新相应的资源绑定。应用程序仍然可以使用其名称访问它,并且重定位是透明的。

答案 7 :(得分:0)

我很好奇为什么official docs如此被忽略,而这些细节已经详细地阐述了。

但是,如果您想了解这些情况,请参阅duffymo's answer

  

Java命名和目录接口 TM (JNDI)是一个应用程序编程接口(API),它为使用Java TM 编程语言编写的应用程序提供命名和目录功能。 。它被定义为独立于任何特定的目录服务实现。因此,可以以通用方式访问各种目录(新的,正在出现的和已经部署的)。

及其架构

enter image description here

通常是how you use it

答案 8 :(得分:0)

我将使用一个示例来说明如何在无需任何应用程序开发人员知道数据库的用户名和密码的情况下使用JNDI来配置数据库。

1)我们已经在JBoss服务器的 standalone-full.xml 中配置了数据源。此外,我们还可以配置池详细信息。

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

enter image description here

现在,此jndi名称及其关联的数据源对象将可用于我们的application.application。

2)我们可以使用JndiDataSourceLookup类检索此数据源对象。

enter image description here

在提供jndi名称之后,Spring将实例化数据源bean。

现在,我们可以根据我们的环境或要求更改池大小,用户名或密码,但这不会影响应用程序。

注意:encryptedSecurityDomain,我们需要像

一样在JBoss服务器中对其进行单独配置
<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>

这是用例之一。希望能弄清楚。