J2EE之JNDI

來源:互聯網
上載者:User

標籤:j2ee

1.什麼是JNDI?

        JNDI( Java Naming and Directory Interface ),是Java平台的一個標準擴充,提供了一組介面、類和關於命名空間的概念。如同其它很多Java技術一樣,JDNI是provider-based的技術,暴露了一個 API和一個服務供應介面(SPI)。這意味著任何基於名字的技術都能通過JNDI而提供服務,只要JNDI支援這項技術。JNDI目前所支援的技術包括 LDAP、CORBA Common Object Service(COS)名字服務、RMI、NDS、DNS、Windows註冊表等等。

        很多J2EE技術,包括EJB都依靠JNDI來組織和定位實體。可以把它理解為一種將對象和名字捆綁的技術(就像是字典類型,有key和value),對象工廠負責生產出對象,這些對象都和唯一的名字綁在一起,外部資源可以通過名字獲得某對象的引用。

2.為什麼要使用JDI?

        我們可以從“如果不用JNDI我們怎樣做?用了JNDI後我們又將怎樣做?“兩個問題來比較,請看下面的例子(以串連資料庫的例子為例):

        1)在不適用JNDI的情況下:

                    Connection conn=null;

try {
  Class.forName("com.mysql.jdbc.Driver",
                true, Thread.currentThread().getContextClassLoader());
  conn=DriverManager.getConnection("jdbc:mysql://MyDBServer?user=qingfeng&password=mingyue");
  
  ......
  conn.close();
catch(Exception e) {
  e.printStackTrace();
finally {
  if(conn!=null) {
    try {
      conn.close();
    } catch(SQLException e) {}
  }
}
        
 

        2)在使用JNDI的情況下:

                    首先應先配置資料來源:

                    <?xml version="1.0" encoding="UTF-8"?> 

<datasources> 
<local-tx-datasource> 
    <jndi-name>MySqlDS </jndi-name> 
    <connection-url>jdbc:mysql://localhost:3306/lw </connection-url> 
    <driver-class>com.mysql.jdbc.Driver </driver-class> 
    <user-name>root </user-name> 
    <password>rootpassword </password> 
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter </exception-sorter-class-name> 
    <metadata> 
      <type-mapping>mySQL </type-mapping> 
    </metadata> 
</local-tx-datasource> 
</datasources>

在程式中引用資料來源:
Connection conn=null;
try {
  Context ctx=new InitialContext();
  Object datasourceRef=ctx.lookup("java:MySqlDS"); //引用資料來源
  DataSource ds=(Datasource)datasourceRef;
  conn=ds.getConnection();
  
  ......
  c.close();

catch(Exception e) {
           e.printStackTrace();

finally {
  if(conn!=null) {
    try {
      conn.close();
    } catch(SQLException e) { }
  }
}

        通過上面兩種情況的對比可以得到:使用JNDI後的程式可以不用關心具體JDBC參數了。在系統部署後,如果資料庫的相關參數變更,只需要重新設定 mysql-ds.xml 修改其中的JDBC參數,只要保證資料來源的名稱不變,那麼程式原始碼就無需修改。由此可見,JNDI避免了程式與資料庫之間的緊耦合,使應用更加易於配置、易於部署。

3.如何使用JNDI?

    在javax.naming的包包中提供Context介面,提供了兩個很好用的方法:    <1> void bind( String name , Object object )        將名稱綁定到對象。所有中間上下文和目標上下文(由該名稱最終原子組件以外的其他所有組件指定)都必須已經存在。    <2>Object lookup( String name )       檢索指定的對象。如果 name為空白,則返回此內容相關的一個新執行個體(該執行個體表示與此上下文相同的命名內容,但其環境可以獨立地        進行修改,而且可以並發訪問)。
         例如下面的一個例子:從JNDI名稱空間儲存和檢索對象
  1. import javax.naming.*;  
  2. public void createName() throws NamingException {  
  3.   Context context= new InitialContext();  
  4.   context.bind("/config/applicationName", "MyApp");  
  5. }  
  6. public String getName() throws NamingException {  
  7.   Context context= new InitialContext();  
  8.   return (String)context.lookup("/config/applicationName");  
  9. }    

J2EE之JNDI

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.