JNDI:(Java Naming and Directory Interface,Java命名和目录接口)是Java API,借助于它提供的接口,开发者能够通过名字定位用户、机器、网络、对象、服务。
在学习JNDI前,很有必要学习下“命名和目录服务”:
名字类似于引用,即能够标识某实体、人等。命名服务类似于话务员,能帮你找到你想要通话对象的电话号码。命名服务能够完成如下几方面任务的实体:
1. 名字和对象绑定在一起
2. 能够提供依据名字查找对象的机制
在企业计算领域,命名服务随处可见,比如DNS能够将机器名转换成IP地址等。
在当今世界,有很多不同的命名和目录产品,他们基于各自的命名和目录标准,为了使这些产品之间能够相互交互,我们引出了JNDI。
在JAVA 开发中,JNDI的应用
一、定位各种资源工厂,比如定位数据源等
比如,我们在用到Spring的项目中,ApplicationContext.xml中定位数据源可以这么做:
[quote]
<bean id="DataSource"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jdbc/dbname</value>
</property>
</bean>
[/quote]
当然了,你的jndiname需要在服务启动的时候加载到容器中:
比如容器如果是tomcat的话,我们把类似于如下的一个配置文件放到conf下:
[quote]
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<!-- 开发环境 -->
<Resource name="jdbc/dbname" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="awpdr" password="awpdr" driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@12.1.10.120:1521:dbname"/>
<Resource name="jdbc/dware" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="dwawpuser" password="dwawpuser" driverClassName="com.teradata.jdbc.TeraDriver"
url="jdbc:teradata://10.1.1.82/client_charset=cp936,COMPAT_DBS=TRUE,COMPAT_GETTABLE=TABLE,database=DWMART_AWP"/>
</Context>
[/quote]
相应的,也要在web.xml 中加入如下配置代码:
[quote]
<!-- DB POOL -->
<resource-ref>
<res-ref-name>[b]jdbc/dbname[/b]</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
<resource-ref>
<res-ref-name>[b]jdbc/dware[/b]</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
[/quote]
总之,在项目中利用JNDI来定位数据源是种常见的用法。
二、客户和EJB组件能够借助与JNDI查找其他EJB组建
比如,我们在用EJB开发时(weblogic作为server),需要在相应的xml中有类似这样的配置:
[quote]
<weblogic-enterprise-bean>
<ejb-name>DcrsConsumerRecoveryAssignmentEJB</ejb-name>
<reference-descriptor>
<ejb-reference-description>
<ejb-ref-name>ejb/hxb/dcrs/QueryEJB</ejb-ref-name>
<jndi-name>ejb/hxb/dcrs/QueryEJB</jndi-name>
</ejb-reference-description>
<ejb-reference-description>
<ejb-ref-name>ejb/hxb/dcrs/GenericEJB</ejb-ref-name>
<jndi-name>ejb/hxb/dcrs/GenericEJB</jndi-name>
</ejb-reference-description>
<ejb-reference-description>
<ejb-ref-name>ejb/WFExecutionEngine</ejb-ref-name>
<jndi-name>
ejb/solution/dbps/WFExecutionEngine
</jndi-name>
</ejb-reference-description>
<ejb-reference-description>
<ejb-ref-name>ejb/WFMonitoringManager</ejb-ref-name>
<jndi-name>
ejb/solution/dbps/WFMonitoringManager
</jndi-name>
</ejb-reference-description>
</reference-descriptor>
[b]<jndi-name>
ejb/hxb/batch/ConsumerRecoveryAssignmentEJB
</jndi-name>[/b]
</weblogic-enterprise-bean>
[/quote]
在学习JNDI前,很有必要学习下“命名和目录服务”:
名字类似于引用,即能够标识某实体、人等。命名服务类似于话务员,能帮你找到你想要通话对象的电话号码。命名服务能够完成如下几方面任务的实体:
1. 名字和对象绑定在一起
2. 能够提供依据名字查找对象的机制
在企业计算领域,命名服务随处可见,比如DNS能够将机器名转换成IP地址等。
在当今世界,有很多不同的命名和目录产品,他们基于各自的命名和目录标准,为了使这些产品之间能够相互交互,我们引出了JNDI。
在JAVA 开发中,JNDI的应用
一、定位各种资源工厂,比如定位数据源等
比如,我们在用到Spring的项目中,ApplicationContext.xml中定位数据源可以这么做:
[quote]
<bean id="DataSource"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jdbc/dbname</value>
</property>
</bean>
[/quote]
当然了,你的jndiname需要在服务启动的时候加载到容器中:
比如容器如果是tomcat的话,我们把类似于如下的一个配置文件放到conf下:
[quote]
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<!-- 开发环境 -->
<Resource name="jdbc/dbname" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="awpdr" password="awpdr" driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@12.1.10.120:1521:dbname"/>
<Resource name="jdbc/dware" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="dwawpuser" password="dwawpuser" driverClassName="com.teradata.jdbc.TeraDriver"
url="jdbc:teradata://10.1.1.82/client_charset=cp936,COMPAT_DBS=TRUE,COMPAT_GETTABLE=TABLE,database=DWMART_AWP"/>
</Context>
[/quote]
相应的,也要在web.xml 中加入如下配置代码:
[quote]
<!-- DB POOL -->
<resource-ref>
<res-ref-name>[b]jdbc/dbname[/b]</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
<resource-ref>
<res-ref-name>[b]jdbc/dware[/b]</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
[/quote]
总之,在项目中利用JNDI来定位数据源是种常见的用法。
二、客户和EJB组件能够借助与JNDI查找其他EJB组建
比如,我们在用EJB开发时(weblogic作为server),需要在相应的xml中有类似这样的配置:
[quote]
<weblogic-enterprise-bean>
<ejb-name>DcrsConsumerRecoveryAssignmentEJB</ejb-name>
<reference-descriptor>
<ejb-reference-description>
<ejb-ref-name>ejb/hxb/dcrs/QueryEJB</ejb-ref-name>
<jndi-name>ejb/hxb/dcrs/QueryEJB</jndi-name>
</ejb-reference-description>
<ejb-reference-description>
<ejb-ref-name>ejb/hxb/dcrs/GenericEJB</ejb-ref-name>
<jndi-name>ejb/hxb/dcrs/GenericEJB</jndi-name>
</ejb-reference-description>
<ejb-reference-description>
<ejb-ref-name>ejb/WFExecutionEngine</ejb-ref-name>
<jndi-name>
ejb/solution/dbps/WFExecutionEngine
</jndi-name>
</ejb-reference-description>
<ejb-reference-description>
<ejb-ref-name>ejb/WFMonitoringManager</ejb-ref-name>
<jndi-name>
ejb/solution/dbps/WFMonitoringManager
</jndi-name>
</ejb-reference-description>
</reference-descriptor>
[b]<jndi-name>
ejb/hxb/batch/ConsumerRecoveryAssignmentEJB
</jndi-name>[/b]
</weblogic-enterprise-bean>
[/quote]