這種作法通常在小規模的開發過程當中不會產生問題,僅僅要程序猿熟悉Java語言、瞭解JDBC技術和MySQL,可以很是快開發出對應的應用程序。
沒有JNDI的作法存在的問題:
一、數據庫server名稱MyDBServer 、username和口令均可能需要改變,由此引起JDBC URL需要改動;
二、數據庫可能改用別的產品,如改用DB2或者Oracle,引起JDBC驅動程序包和類名需要改動;
三、隨着實際使用終端的添加,原配置的鏈接池參數可能需要調整;
四、......
解決的方法:
程序猿應該不需要關心「詳細的數據庫後臺是什麼?JDBC驅動程序是什麼?JDBC URL格式是什麼?訪問數據庫的username和口令是什麼?」等等這些問題。程序猿編寫的程序應該沒有對 JDBC 驅動程序的引用,沒有server名稱,沒實username稱或口令 —— 甚至沒有數據庫池或鏈接管理。java
而是把這些問題交給J2EE容器(比方weblogic)來配置和管理,程序猿僅僅需要對這些配置和管理進行引用就能夠。
由此,就有了JNDI。mysql
//看的出來。是爲了一個最最核心的問題:是爲了解耦,是爲了開發出更加可維護、可擴展//的系統
用了JNDI以後的作法:
首先。在在J2EE容器中配置JNDI參數,定義一個數據源。也就是JDBC引用參數,給這個數據源設置一個名稱;而後,在程序中,經過數據源名稱引用數據源從而訪問後臺數據庫。
//紅色的字可以看出。JNDI是由j2ee容器提供的功能
詳細操做例如如下(以JBoss爲例):
一、配置數據源
在JBoss 的 D:\jboss420GA\docs\examples\jca 文件夾如下。有很是多不一樣數據庫引用的數據源定義模板。web
將當中的 mysql-ds.xml 文件Copy到你使用的server下,如 D:\jboss420GA\server\default\deploy。
改動 mysql-ds.xml 文件的內容,使之能經過JDBC正確訪問你的MySQL數據庫。例如如下:
sql
xml version="1.0" encoding="UTF-8"?> 數據庫
//解藕了。可擴展了
在系統部署後。假設數據庫的相關參數變動。僅僅需要又一次配置 mysql-ds.xml 改動當中的JDBC參數,僅僅要保證數據源的名稱不變,那麼程序源碼就無需改動。編程
因而可知。JNDI避免了程序與數據庫之間的緊耦合,使應用更加易於配置、易於部署。架構
JNDI的擴展:
JNDI在知足了數據源配置的要求的基礎上。還進一步擴充了做用:所有與系統外部的資源的引用,都可以經過JNDI定義和引用。app
//注意什麼叫資源
因此,在J2EE規範中,J2EE 中的資源並不侷限於 JDBC 數據源。ide
引用的類型有很是多,當中包含資源引用(已經討論過)、環境實體和 EJB 引用。post
特別是 EJB 引用,它暴露了 JNDI 在 J2EE 中的另一項關鍵角色:查找其它應用程序組件。
EJB 的 JNDI 引用很是類似於 JDBC 資源的引用。在服務趨於轉換的環境中,這是一種很是有效的方法。可以對應用程序架構中所獲得的所有組件進行這類配置管理,從 EJB 組件到 JMS 隊列和主題。再到簡單配置字符串或其它對象。這可以下降隨時間的推移服務變動所產生的維護成本,同一時候還可以簡化部署,下降集成工做。外部資源」。
總結:
J2EE 規範要求所有 J2EE 容器都要提供 JNDI 規範的實現。//sun 果真喜歡制定規範JNDI 在 J2EE 中的角色就是「交換機」 —— J2EE 組件在執行時間接地查找其它組件、資源或服務的通用機制。在多數狀況下,提供 JNDI 供應者的容器可以充當有限的數據存儲。這樣管理員就可以設置應用程序的執行屬性,並讓其它應用程序引用這些屬性(Java 管理擴展(Java Management Extensions,JMX)也可以用做這個目的)。JNDI 在 J2EE 應用程序中的主要角色就是提供間接層,這樣組件就可以發現所需要的資源,而不用瞭解這些間接性。
在 J2EE 中,JNDI 是把 J2EE 應用程序合在一塊兒的粘合劑。JNDI 提供的間接尋址贊成跨企業交付可伸縮的、功能強大且很是靈活的應用程序。
這是 J2EE 的承諾,而且通過一些計劃和預先考慮。這個承諾是全然可以實現的。
從上面的文章中可以看出:
一、JNDI 提出的目的是爲了解藕,是爲了開發更加easy維護,easy擴展。easy部署的應用。
二、JNDI 是一個sun提出的一個規範(類似於jdbc),詳細的實現是各個j2ee容器提供商。sun 僅僅是要求,j2ee容器必須有JNDI這種功能。
三、JNDI 在j2ee系統中的角色是「交換機」,是J2EE組件在執行時間接地查找其它組件、資源或服務的通用機制。
四、JNDI 是經過資源的名字來查找的,資源的名字在整個j2ee應用中(j2ee容器中)是惟一的。
再轉一篇文章:
JNDI全稱 Java Naming and Directory Interface
JNDI是Java平臺的一個標準擴展,提供了一組接口、類和關於命名空間的概念。如同其它很是多Java技術同樣,JDNI是provider-based的技術,暴露了一個API和一個服務供應接口(SPI)。這意味着不論什麼基於名字的技術都能經過JNDI而提供服務。僅僅要JNDI支持這項技術。
JNDI眼下所支持的技術包含LDAP、CORBA Common Object Service(COS)名字服務、RMI、NDS、DNS、Windows註冊表等等。很是多J2EE技術,包含EJB都依靠JNDI來組織和定位實體。
JDNI經過綁定的概念將對象和名稱聯繫起來。
在一個文件系統中。文件名稱被綁定給文件。在DNS中,一個IP地址綁定一個URL。在文件夾服務中。一個對象名被綁定給一個對象實體。
JNDI中的一組綁定做爲上下文來引用。每個上下文暴露的一組操做是一致的。好比,每個上下文提供了一個查找操做。返回指定名字的對應對象。每個上下文都提供了綁定和撤除綁定名字到某個對象的操做。
JNDI使用通用的方式來暴露命名空間,即便用分層上下文以及使用一樣命名語法的子上下文。
jndi的用途:
1。你可以用jndi來獲得object類的屬性
如: