java:comp/env/jdbc/datasource 與 jdbc/datasource 的不

理解JNDI中 java:comp/env/jdbc/datasource 與 jdbc/datasource 的不同之處。
在描述JNDI,例如獲得數據源時,JNDI地址有兩種寫法,例如同是 jdbc/testDS 數據源:
A: java:comp/env/jdbc/testDS
B: jdbc/testDS

這兩種寫法,配置的方式也不盡相同,第一種方法應該算是一種利於程序移植或遷移的方法,它的實現與“映射”的概念相同,而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子上下文中聲明

可以通過下面的結構示意來發現這兩種描述的不同之處:
A: java:comp/env/jdbc/testDS(虛地址) ------> 映射描述符 ------> jdbc/testDS (實際的地址)
B: jdbc/testDS (實際的地址)
從這種結構上來看,A的確是便於移植的。

再來看一個例子:
假如你需要獲取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),用第一種寫法反而會報錯的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章