JNDI到底是什麼?

 前言

              在上一篇文章中筆者就J2EE的十三種技術規範做了一個簡單的總結。雖然很多種技術規範小生

          都沒有接觸過,不過總結一下方便日後的學習。也使自己對J2EE整個有一個認知。上篇文章中筆

          者對JNDI完全沒弄明白是怎麼回事。通過查找資料總算是有些眉目了,現做一個總結。

              要理解JNDI,我們要從其作用入手,通過對比不使用JNDI和使用JNDI來理解他,體會使用它的

          好處。

        NO JNDI

               首先我們看看不是用JNDI的情況。

               我們在進行數據庫應用開發的時候,必然會使用JDBC來操作數據庫。通過不同的URL我們可以

           連接到不同的數據庫。這種代碼可能我們已經寫過很多次了。就像這樣。     

  1. package com.kiritor;  
  2. /** 
  3.  * 數據庫連接 
  4.  * @author Kiritor*/  
  5. import java.sql.Connection;  
  6. import java.sql.DriverManager;  
  7. import java.sql.SQLException;  
  8.   
  9. public class DBUitls {  
  10.     private static String username = "root";  
  11.     private static String password = "root";  
  12.     private static String url = "jdbc:mysql://localhost:3306/manchat";  
  13.   
  14.     public static Connection buildCollection() {  
  15.         Connection connection = null;  
  16.         try {  
  17.             Class.forName("com.mysql.jdbc.Driver");  
  18.   
  19.             connection = DriverManager.getConnection(url, username, password);  
  20.             if (connection != null) {  
  21.                 System.out.println("數據庫連接成功!" + connection);  
  22.             }  
  23.         } catch (ClassNotFoundException | SQLException e) {  
  24.             e.printStackTrace();  
  25.         }  
  26.         return connection;  
  27.     }  
  28. }  
                 這是較爲傳統的做法,這種做法在小規模的開發中不會產生太大問題。不過仔細思考下

          會存在下面幾方面的問題。

                 1、數據庫服務器名稱,用戶名,密碼很可能需要改變,我們就必須去修改源碼,這不是

                     一種合理的做法。

                  2、數據庫可能改用其他產品(MySQL->Oracle),這也會引起修改。

                  3、數據庫實際使用的終端增加,原配置的連接池可能需要調整。

            意識到上述的缺點,JNDI就是來幫助我們解決這個問題的。看看是如何解決的吧!

        使用JNDI

                使用JNDI之前我們需要做一些配置,這裏筆者使用的是Tomcat7.0系列的和以前版本的Tomcat

           配置略有不同。

                 1、在項目的WebContent-META-INF下新建一個context.xml文件,注意必須在這個目錄下配置。

            Tomcat會自動的找到這個文件(其實這是一種JNDI局部配置的方式)。

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <Context  
  3.     crossContext="true"  
  4.     path=""  
  5.     reloadable="true" >  
  6.   
  7.     <Resource  
  8.         name="jndi/mybatis" --mybatis一般設置爲該項目的項目名  
  9.         auth="Container" --該項爲不可變項  
  10.         driverClassName="com.mysql.jdbc.Driver" --數據庫驅動名  
  11.         maxActive="100" --最大連接數  
  12.         maxIdle="30" --最大空閒連接數  
  13.         maxWait="10000" --最大等待毫秒數,若爲-1則無限等待  
  14.         password="root"  
  15.         type="javax.sql.DataSource" --該項爲不可變項  
  16.         url="jdbc:mysql://127.0.0.1:3306/manchat?<code class="html string">autoReconnect=true</code>" --url  
  17.         username="root" />  
  18. </Context>  
              
                2、自Tomcat6.0之後我們就可以不在web.xml中做配置了。親測可行!

              不過這裏還是將其配置代碼貼出來。 

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">  
  3.   <display-name>Test</display-name>  
  4.   <welcome-file-list>  
  5.     <welcome-file>index.html</welcome-file>  
  6.     <welcome-file>index.htm</welcome-file>  
  7.     <welcome-file>index.jsp</welcome-file>  
  8.     <welcome-file>default.html</welcome-file>  
  9.     <welcome-file>default.htm</welcome-file>  
  10.     <welcome-file>default.jsp</welcome-file>  
  11.   </welcome-file-list>  
  12.   <resource-ref>  
  13.   <description>JNDI DataSource</description>  
  14.   <res-ref-name>jndi/mybatis</res-ref-name> --這裏的名字應該要和context.xml的名字一樣  
  15.   <res-type>javax.sql.DataSource</res-type>  
  16.   <res-auth>Container</res-auth>  
  17.   </resource-ref>  
  18. </web-app>  
                3、我們使用JNDI連接池技術來得到數據庫的連接。
  1. package com.kiritor;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.SQLException;  
  5.   
  6. import javax.naming.Context;  
  7. import javax.naming.InitialContext;  
  8. import javax.sql.DataSource;  
  9.   
  10. public class JNDIDB {  
  11.   public static Connection bulidConnection()  
  12.   {  
  13.       Connection conn=null;  
  14.       try {  
  15.           InitialContext ctx = new InitialContext();  
  16.           Context envContext = (Context) ctx.lookup("java:comp/env");  
  17.           DataSource ds = (DataSource) envContext.lookup("jndi/mybatis");  
  18.            conn = ds.getConnection();  
  19.       }   
  20.       catch(Exception e) {  
  21.         e.printStackTrace();  
  22.       }   
  23.       return conn;  
  24.        
  25.   }  
  26. }  
               4、測試,注意這裏不能簡單的使用一個Main進行測試的,必須結合前臺和後臺進行測試。

            這裏我們在JSP頁面中調用JNDIDB的方法,看看是否產生一個conn對象。

  1. <jsp:useBean id="db" class="com.kiritor.JNDIDB" />  
  2.     <%  
  3.         out.println(db.bulidConnection());  
  4.     %>  
                  最後頁面上確實產生了connection對象的,圖就不貼了。

                 通過上述步驟我們看到了,似乎是用JNDI和傳統的JDBC得到連接的代碼量差不多,但JNDI卻

             多了 更多的配置。那麼JNDI的有點體現在哪裏呢?

                  簡單的說是用JNDI的配置雖然多了,但是在數據庫的相關參數變更是,我們只需要重新修改一

             下 配置文件就行了,只要保證數據源的名字不變,那麼程序的源代碼就不需要改變,而傳統JDBC

              的方式我們必須修改源文件,且對他進行重新編譯。

                  由此可見JNDI避免了程序與數據庫之間的緊耦合,是應用更加易於配置、易於部署和維護。

           JNDI擴展

                     JNDI在滿足了數據源配置的要求的基礎上,還進一步擴充了作用:所有與系統外部的資源

              的引用,都可以通過JNDI定義和引用。所以,在J2EE規範中,J2EE 中的資源並不侷限於 JDBC

              數據源。引用的類型有很多,其中包括資源引用(已經討論過)、環境實體和 EJB 引用。特別是

              EJB 引用,它暴露了 JNDI 在 J2EE 中的另外一項關鍵角色:查找其他應用程序組件。

                    EJB 的 JNDI 引用非常類似於 JDBC 資源的引用。在服務趨於轉換的環境中,這是一種很有效

              的方法。可以對應用程序架構中所得到的所有組件進行這類配置管理,從 EJB 組件到 JMS 隊列和

              主題,再到簡單配置字符串或其他對象,這可以降低隨時間的推移服務變更所產生的維護成本,

              同時還可以簡化部署,減少集成工作。 外部資源”。 

          總結:

                  J2EE 規範要求所有 J2EE 容器都要提供 JNDI 規範的實現。JNDI 在 J2EE 中的角色就是“交換機” 

           —— J2EE 組件在運行時間接地查找其他組件、資源或服務的通用機制。在多數情況下,提供 JNDI 

           供應者的容器可以充當有限的數據存儲,這樣管理員就可以設置應用程序的執行屬性,並讓其他應用程

           序引用這些屬性(Java 管理擴展(Java Management Extensions,JMX)也可以用作這個目的)。

           JNDI 在 J2EE 應用程序中的主要角色就是提供間接層,這樣組件就可以發現所需要的資源,而不用了

           解這些間接性。

                 在 J2EE 中,JNDI 是把 J2EE 應用程序合在一起的粘合劑,JNDI 提供的間接尋址允許跨企業交付

            可伸縮的、功能強大且很靈活的應用程序。這是 J2EE 的承諾,而且經過一些計劃和預先考慮,

            這個承諾是完全可以實現的。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章