在描述JNDI,例如得到數據源時,JNDI地址有兩種寫法,例如同是 jdbc/testDS 數據源:
A: java:comp/env/jdbc/testDS
B: jdbc/testDSjava
這兩種寫法,配置的方式也不盡相同,第一種方法應該算是一種利於程序移植或遷移的方法,它的實現與「映射」的概念相同,而B方法,則是一個硬引用。
java:comp/env 是環境命名上下文(environment naming context(ENC)),是在EJB規範1.1之後引入的,引入這個是爲了解決原來JNDI查找所引發的衝突問題,也是爲了提升EJB或者J2EE應用的移植性。
在J2EE中的引用經常使用的有:
JDBC 數據源引用在java:comp/env/jdbc 子上下文中聲明
JMS 鏈接工廠在java:comp/env/jms 子上下文中聲明
JavaMail 鏈接工廠在java:comp/env/mail 子上下文中聲明
URL 鏈接工廠在 java:comp/env/url子上下文中聲明web
能夠經過下面的結構示意來發現這兩種描述的不一樣之處:
A: java:comp/env/jdbc/testDS(虛地址) ------> 映射描述符 ------> jdbc/testDS (實際的地址)
B: jdbc/testDS (實際的地址)
從這種結構上來看,A的確是便於移植的。sql
再來看一個例子:
假如你須要獲取datasource,例如:dataSource = (DataSource) ctx.lookup("java:comp/env/jdbc/testDS");
那麼在配置文件中進行資源映射時,在web.xml中,
<resource-ref>
<res-ref-name>jdbc/testDS</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
在相應的資源配置xml中(不一樣的應用服務器均不一樣,WSAD中,能夠進行可視化的設置),
<reference-descriptor>
<resource-description>
<res-ref-name>jdbc/DBPool</res-ref-name>
<jndi-name>OraDataSource</jndi-name>
</resource-description>
</reference-descriptor>
實際服務器中的JNDI名字是OraDataSource,邏輯名jdbc/DBPool只是用來和它做映射的,這樣作的好處是爲了提升可移植性,移植的時候只須要把配置文件改一下就能夠,而應用程序可不用改動。服務器
假如你寫了一個通常的應用程序,想直接經過JNDI來獲取數據源,那麼直接lookup(「mytest」)就能夠了(假如服務器上的JNDI爲mytest),用第一種寫法反而會報錯的。url