JNDI--Java命名與目錄介面
原文地址:http://sishuok.com/forum/blogPost/list/1186.html
JNDI 是什麼
JNDI是 Java 命名與目錄介面(Java Naming and Directory Interface),在J2EE規範中是重要的規範之一,不少專家認為,沒有透徹理解JNDI的意義和作用,就沒有真正掌握J2EE特別是EJB的知識。
那麼,JNDI到底起什麼作用?
要了解JNDI的作用,我們可以從“如果不用JNDI我們怎樣做?用了JNDI後我們又將怎樣做?”這個問題來探討。
沒有JNDI的做法:
程式設計師開發時,知道要開發訪問MySQL資料庫的應用,於是將一個對 MySQL JDBC 驅動程式類的引用進行了編碼,並通過使用適當的 JDBC URL 連線到資料庫。
就像以下程式碼這樣:
- 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並進行SQL操作 */
- ......
- conn.close();
- }
- catch(Exception e) {
- e.printStackTrace();
- }
- finally {
- if(conn!=null) {
- try {
- conn.close();
- } catch(SQLException e) {}
- }
- }
這是傳統的做法,也是以前非Java程式設計師(如Delphi、VB等)常見的做法。這種做法一般在小規模的開發過程中不會產生問題,只要程式設計師熟悉Java語言、瞭解JDBC技術和MySQL,可以很快開發出相應的應用程式。
沒有JNDI的做法存在的問題:
1、資料庫伺服器名稱MyDBServer 、使用者名稱和口令都可能需要改變,由此引發JDBC URL需要修改;
2、資料庫可能改用別的產品,如改用DB2或者Oracle,引發JDBC驅動程式包和類名需要修改;
3、隨著實際使用終端的增加,原配置的連線池引數可能需要調整;
4、......
解決辦法:
程式設計師應該不需要關心“具體的資料庫後臺是什麼?JDBC驅動程式是什麼?JDBC URL格式是什麼?訪問資料庫的使用者名稱和口令是什麼?”等等這些問題,程式設計師編寫的程式應該沒有對 JDBC 驅動程式的引用,沒有伺服器名稱,沒有使用者名稱稱或口令 —— 甚至沒有資料庫池或連線管理。而是把這些問題交給J2EE容器來配置和管理,程式設計師只需要對這些配置和管理進行引用即可。
由此,就有了JNDI。
用了JNDI之後的做法:
首先,在在J2EE容器中配置JNDI引數,定義一個數據源,也就是JDBC引用引數,給這個資料來源設定一個名稱;然後,在程式中,通過資料來源名稱引用資料來源從而訪問後臺資料庫。
具體操作如下(以JBoss為例):
1、配置資料來源
在JBoss的 D:/jboss420GA/docs/examples/jca 資料夾下面,有很多不同資料庫引用的資料來源定義模板。將其中的 mysql-ds.xml 檔案Copy到你使用的伺服器下,如 D:/jboss420GA/server/default/deploy。
修改 mysql-ds.xml 檔案的內容,使之能通過JDBC正確訪問你的MySQL資料庫,如下:
- <?xmlversion="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>
這裡,定義了一個名為MySqlDS的資料來源,其引數包括JDBC的URL,驅動類名,使用者名稱及密碼等。
2、在程式中引用資料來源:
- Connection conn=null;
- try {
- Context ctx=new InitialContext();
- Object datasourceRef=ctx.lookup("java:MySqlDS"); //引用資料來源
- DataSource ds=(Datasource)datasourceRef;
- conn=ds.getConnection();
- /* 使用conn進行資料庫SQL操作 */
- ......
- c.close();
- }
- catch(Exception e) {
- e.printStackTrace();
- }
- finally {
- if(conn!=null) {
- try {
- conn.close();
- } catch(SQLException e) { }
- }
- }
直接使用JDBC或者通過JNDI引用資料來源的程式設計程式碼量相差無幾,但是現在的程式可以不用關心具體JDBC引數了。
在系統部署後,如果資料庫的相關引數變更,只需要重新配置 mysql-ds.xml 修改其中的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 的承諾,而且經過一些計劃和預先考慮,這個承諾是完全可以實現的。
最近一直在對J2EE的筆記進行整理和複習,雖然J2EE視訊是看過一遍了,但是當我看自己做的筆記的時候陌生程度還是很大,而真正的對某個概念有所認識的時候是將筆記和以前看過的視訊印象進行摩擦,J2EE主要講解的內容是各個規範,再清楚一些就是各個概念,現階段的目標並不是掌握J2EE,而是對J2EE進行輪廓和概念上的瞭解和認識,到下一步DRP專案中再深層次的對各個規範進行摩擦和認識。
JNDI,翻譯為Java命名和目錄結構(JavaNaming And Directory Interface)官方對其解釋為JNDI是一組在Java應用中訪問命名和目錄服務的API(ApplicationProgramming Interface)說明很精煉,但是比較抽象。
上面的解釋中提高了命名服務和目錄服務兩個概念.先要了解JNDI就必須知道,命名服務和目錄服務是做什麼用的。
學習新的概念和知識,比較有效的方式是通過和以前所學過的內容進行聯絡,比較。
關於命名服務,其實我們很多時候都在用它,但是並不知道它是它,比較典型的是域名伺服器DNS(Domain Naming Service),大對人對DNS還是比較瞭解的,它是將域名對映到IP地址的服務.比如百度的域名www.baidu.com所對映的IP地址是http://202.108.22.5/,你在瀏覽器中輸入兩個內容是到的同一個頁面.用命名伺服器的原因是因為我們記憶baidu這幾個有意義的字母要比記202.108.22.5更容易記憶,但如果站到計算機的角度上,它更喜歡處理這些數字。
從我們生活中找的話還有很多類似的例子,比如說你的身份證號和你的名字可以"理解"成一種命名服務,你的學號和姓名也可以"解釋"為一種命名服務。
可以看出命名服務的特點:一個值和另一個值的對映,將我們人類更容易認識的值同計算機更容易認識的值進行一一對映。
到現在應該對命名服務有所理解吧?
至於目錄服務,從計算機角度理解為在網際網路上有著各種各樣的資源和主機,但是這些內容都是散落在網際網路中,為了訪問這些散落的資源並獲得相應的服務,就需要用到目錄服務。
從我們日常生活中去理解目錄服務的概念可以從電話簿說起,電話簿本身就是一個比較典型的目錄服務,如果你要找到某個人的電話號碼,你需要從電話簿裡找到這個人的名稱,然後再看其電話號碼。
理解了命名服務和目錄服務再回過頭來看JDNI,它是一個為Java應用程式提供命名服務的應用程式介面,為我們提供了查詢和訪問各種命名和目錄服務的通用統一的介面.通過JNDI統一介面我們可以來訪問各種不同型別的服務.如下圖所示,我們可以通過JNDI API來訪問剛才談到的DNS。
至此已經對JNDI有了一個初步認識,如果想要進一步瞭解JNDI,並對使用JDNI給我們帶來哪些便利之處,我推薦兩篇關於JDNI的文章,寫的非常的好,兩篇文章從“如果不用JNDI我們怎樣做?用了JNDI後我們又將怎樣做?”這個角度來加深對JNDI的認識。
相關推薦
JNDI--Java命名與目錄介面
原文地址:http://sishuok.com/forum/blogPost/list/1186.htmlJNDI 是什麼JNDI是 Java 命名與目錄介面(Java Naming and Directory Interface),在J2EE規範中是重要的規範之一,不少專家
Java命名與目錄介面——JNDI
JNDI是 Java 命名與目錄介面(Java Naming and Directory Interface),在J2EE規範中是重要的規範之一,不少專家認為,沒有透徹理解JNDI的意義和作用,就沒有真正掌握J2EE特別是EJB的知識。JNDI到底起什麼作用? 沒有J
[精華] JNDI(Java 命名和目錄介面)
JNDI(Java 命名和目錄介面) 分散式計算環境通常使用命名和目錄服務來獲取共享的元件和資源。命名和目錄服務將名稱與位置、服務、資訊和資源關聯起來。 命名服務提供名稱—物件的對映。目錄服務提供有關物件的資訊,並提供定位這些物件所需的搜尋工具。有許多命名和目錄服務實現,並且到它們的介面是不同的。 Jav
JNDI(Java 命名和目錄介面)(三)---- Tomcat中配置和使用JNDI
JNDI是J2EE中一個很重要的標準,通常我們是在EJB程式設計中用到, Tomcat4.0中提供了在JSP和Servelt中直接使用JNDI的方法,下面談一下在Tomcat4.0中配置和使用JNDI的方法 (以通過JNDI連線資料庫為例) 假設使用的資料庫是mysql,實驗例子在TOMCAT_HOME
JNDI(Java 命名和目錄介面)(一)
JNDI(Java 命名和目錄介面) 分散式計算環境通常使用命名和目錄服務來獲取共享的元件和資源。命名和目錄服務將名稱與位置、服務、資訊和資源關聯起來。 命名服務提供名稱—物件的對映。目錄服務提供有關物件的資訊,並提供定位這些物件所需的搜尋工具。有許多命名和目錄服務實現,並且到它們的介面是不同的。 Java
JNDI(Java Naming and Directory Interface,Java命名和目錄接口)
負載平衡 抽象層 共享 eight interface dsm 通過 data win JNDI(Java Naming and Directory Interface,Java命名和目錄接口)是SUN公司提供的一種標準的Java命名系統接口,JNDI提供統一的客戶端API
JNDI 命名和目錄介面
是Java平臺的一個標準擴充套件,提供了一組介面、類和關於名稱空間的概念。如同其它很多Java技術一樣,JDNI是provider-based的技術,暴露了一個API和一個服務供應介面(SPI)。這意味著任何基於名字的技術都能通過JNDI而提供服務,只要JNDI支援這項技術。JNDI目前所支援的技術包括LDA
利用JNDI的命名與服務功能來滿足企業級API對命名與服務的訪問
插入 同時 程序 企業 服務器 邏輯 direct 對象 建立 包含了大量的命名和目錄服務,使用通用接口來訪問不同種類的服務; 可以同時連接到多個命名或目錄服務上; 建立起邏輯關聯,允許把名稱同Java對象或資源關聯起來,而不必知道對象或資源的物理ID。 JNDI程序包:
java Comparable與Comparator介面的區別
public class MyTest { public static strictfp void main(String[] args) { String[] arr = {"bbbb","aaa","cc"}; /* * 利用String預設
Java 檔案與目錄管理
目錄是管理檔案的特殊機制,同類檔案儲存在同一個目錄下不僅可以簡化檔案管理,而且還可以提高工作效率。Java 語言在 java.io 包中定義了一個 File 類專門用來管理磁碟檔案和目錄。 每個 File 類物件表示一個磁碟檔案或目錄,其物件屬性中包含了檔案或目錄的相關資訊
前言與目錄-java常用算法手冊(零)
java 算法思想 前言 這一 p s 就是 mar 手冊 關於 假期得空看完了這本吃灰好久的書了,這一的帖子就是關於讀這本書的筆記與思考吧 帖子大致內容: 何為算法 java語法 數據結構 算法思想 算法應用 等 前言與目錄-java常用算法手冊(零)
Linux編程 5 (目錄重命名與移動mv,刪除文件rm,目錄創建mkdir刪除rmdir,查看file,cat,more,tail,head)
查看 nod 9.png tail命令 重命名文件 進程 文件頭 .com mv 命令 一. 文件重命名與移動(mv) 在linux中,重命名文件稱為移動(moving)。mv命令可以將文件和目錄移動到另一個位置或重新命名。 1.1 使用mv重命名 下
java中的AutoCloseable介面與try with resources
try-with-resources引入的背景 很多Java程式都需要操作一些資源,如檔案、流(streams)、套接字(sockets)和資料庫連線(database connections)。操作這些資源的時候得很小心,因為它們操作的時候獲取了作業系統的資源。所以你得保證,即使在發生
JAVA程式設計題解與上機指導 第四版 第8章 Java的圖形使用者介面設計 8.2 建立“My JFrame”
一、簡介:程式設計實現建立並顯示一個標題為“My Frame”,Frame背景為黑色,Panel背景為白色,其中,Panel中加入“開啟”“關閉”“返回”三個按鈕,並一行排開。 二、程式碼如下: import java.awt.*; import javax.swing.*; import ja
Java容器深入淺出之Collection與Iterator介面
Java中用於儲存物件的容器,除了陣列,就是Collection和Map介面下的容器實現類了,包括用於迭代容器中物件的Iterator介面,構成了Java資料結構主體的集合體系。其中包括: 1. Collection:包括Set、List和Queue;主要的實現類有HashSet、TreeSet、Array
JAVA筆記四:介面、lambda表示式與內部類
一、介面 1.1介面的概念 介面不是類,而是對類的一組需求描述 ,介面所有方法自動為public,當然在定義介面的時候加上也不違反語法規則。 java.lang.Comparable<T>1.0 int compareTo(T other) //小於other則返回負
Java專案部署目錄結構與部署方法 打包方法attilax總結 目錄 1.1. Java web專案部署目錄結構 1 2. Springboot專案的部署結構 2 3. Java專案的開發模式下目錄
Java專案部署目錄結構與部署方法 打包方法attilax總結 目錄 1.1. Java web專案部署目錄結構 1 2. Springboot專案的部署結構 2 3. Java專案的開發模式下目錄結構與路徑 2 3.1. 原則上儘可能與jee規範一致比較好 2
Java中類的比較與排序方法(應用Comparable介面與Comparator介面)
引言 在平時寫Java的程式的時候,如果要進行一些基本型別的變數的比較,可以很方便得呼叫’Math.max()’、Math.min()等方法,如果要對陣列或者列表進行排序,也可以用Arrays.sort()和Collections.sort()等已經封裝好的方法來進行。但是,如果是一個自
JAVA 增刪改查介面命名規範
開發時,有很多規範,這裡寫的是命名規範。 Dao 介面命名 insert batchInsert selectOne selectById count selectList update deleteById
Java Callable介面與Future介面的兩種使用方式
Java Callable、Future的兩種使用方式Callable+Futurepublic class Test { public static void main(String[] args) { ExecutorService executor = Executors.newCachedThread