[轉]理解JNDI中 java:comp/env/jdbc/datasource 與 jdbc...

在描述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

相關文章
相關標籤/搜索