| JNDI是 Java 命名與目錄接口(Java Naming and Directory Interface),在J2EE規范中是重要的規范之一,不少專(zhuān)家認為,沒(méi)有透徹理解JNDI的意義和作用,就沒(méi)有真正掌握J2EE特別是EJB的知識。 那么,JNDI到底起什么作用? 要了解JNDI的作用,我們可以從“如果不用JNDI我們怎樣做?用了JNDI后我們又將怎樣做?”這個(gè)問(wèn)題來(lái)探討。 沒(méi)有JNDI的做法: 程序員開(kāi)發(fā)時(shí),知道要開(kāi)發(fā)訪(fǎng)問(wèn)MySQL數據庫的應用,于是將一個(gè)對 MySQL JDBC 驅動(dòng)程序類(lèi)的引用進(jìn)行了編碼,并通過(guò)使用適當的 JDBC URL 連接到數據庫。 就像以下代碼這樣: Connection conn=null; 這是傳統的做法,也是以前非Java程序員(如Delphi、VB等)常見(jiàn)的做法。這種做法一般在小規模的開(kāi)發(fā)過(guò)程中不會(huì )產(chǎn)生問(wèn)題,只要程序員熟悉Java語(yǔ)言、了解JDBC技術(shù)和MySQL,可以很快開(kāi)發(fā)出相應的應用程序。 沒(méi)有JNDI的做法存在的問(wèn)題: 1、數據庫服務(wù)器名稱(chēng)MyDBServer 、用戶(hù)名和口令都可能需要改變,由此引發(fā)JDBC URL需要修改; 2、數據庫可能改用別的產(chǎn)品,如改用DB2或者Oracle,引發(fā)JDBC驅動(dòng)程序包和類(lèi)名需要修改; 3、隨著(zhù)實(shí)際使用終端的增加,原配置的連接池參數可能需要調整; 4、...... 解決辦法: 程序員應該不需要關(guān)心“具體的數據庫后臺是什么?JDBC驅動(dòng)程序是什么?JDBC URL格式是什么?訪(fǎng)問(wèn)數據庫的用戶(hù)名和口令是什么?”等等這些問(wèn)題,程序員編寫(xiě)的程序應該沒(méi)有對 JDBC 驅動(dòng)程序的引用,沒(méi)有服務(wù)器名稱(chēng),沒(méi)有用戶(hù)名稱(chēng)或口令 —— 甚至沒(méi)有數據庫池或連接管理。而是把這些問(wèn)題交給J2EE容器來(lái)配置和管理,程序員只需要對這些配置和管理進(jìn)行引用即可。 由此,就有了JNDI。 用了JNDI之后的做法: 首先,在在J2EE容器中配置JNDI參數,定義一個(gè)數據源,也就是JDBC引用參數,給這個(gè)數據源設置一個(gè)名稱(chēng);然后,在程序中,通過(guò)數據源名稱(chēng)引用數據源從而訪(fǎng)問(wèn)后臺數據庫。 具體操作如下(以JBoss為例): 1、配置數據源 在JBoss的 D:\jboss420GA\docs\examples\jca 文件夾下面,有很多不同數據庫引用的數據源定義模板。將其中的 mysql-ds.xml 文件Copy到你使用的服務(wù)器下,如 D:\jboss420GA\server\default\deploy。 修改 mysql-ds.xml 文件的內容,使之能通過(guò)JDBC正確訪(fǎng)問(wèn)你的MySQL數據庫,如下: <?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> 這里,定義了一個(gè)名為MySqlDS的數據源,其參數包括JDBC的URL,驅動(dòng)類(lèi)名,用戶(hù)名及密碼等。 2、在程序中引用數據源: Connection conn=null; 直接使用JDBC或者通過(guò)JNDI引用數據源的編程代碼量相差無(wú)幾,但是現在的程序可以不用關(guān)心具體JDBC參數了。
什么是JNDIJNDI全稱(chēng) Java Naming and Directory Interface JNDI是Java平臺的一個(gè)標準擴展,提供了一組接口、類(lèi)和關(guān)于命名空間的概念。如同其它很多Java技術(shù)一樣,JDNI是provider-based的技術(shù),暴露了一個(gè)API和一個(gè)服務(wù)供應接口(SPI)。這意味著(zhù)任何基于名字的技術(shù)都能通過(guò)JNDI而提供服務(wù),只要JNDI支持這項技術(shù)。JNDI目前所支持的技術(shù)包括LDAP、CORBA Common Object Service(COS)名字服務(wù)、RMI、NDS、DNS、Windows注冊表等等。很多J2EE技術(shù),包括EJB都依靠JNDI來(lái)組織和定位實(shí)體。 JDNI通過(guò)綁定的概念將對象和名稱(chēng)聯(lián)系起來(lái)。在一個(gè)文件系統中,文件名被綁定給文件。在DNS中,一個(gè)IP地址綁定一個(gè)URL。在目錄服務(wù)中,一個(gè)對象名被綁定給一個(gè)對象實(shí)體。 JNDI中的一組綁定作為上下文來(lái)引用。每個(gè)上下文暴露的一組操作是一致的。例如,每個(gè)上下文提供了一個(gè)查找操作,返回指定名字的相應對象。每個(gè)上下文都提供了綁定和撤除綁定名字到某個(gè)對象的操作。JNDI使用通用的方式來(lái)暴露命名空間,即使用分層上下文以及使用相同命名語(yǔ)法的子上下文。 jndi的用途: 1。你可以用jndi來(lái)得到object類(lèi)的屬性 如:Attribute attr =directory.getAttributes(personName).get("email"); String email = (String)attr.get(); 2。你可以用jndi來(lái)搜索對象 如:foxes = directory.search("o=Wiz,c=US", "sn=Fox", controls); 查找誰(shuí)的名字叫Fox在wiz部門(mén)的員工? 3。你可以用jndi通過(guò)naming/directory服務(wù)查詢(xún)像printers和databases的對象 如:查詢(xún) Printer Printer printer = (Printer)namespace.lookup(printerName); printer.print(document); 4。你可以用jndi列表出命名空間的特殊級別的內容 如: NamingEnumeration list = namespace.list("o=Widget, c=US"); while (list.hasMore()) { NameClassPair entry = (NameClassPair)list.next(); display(entry.getName(), entry.getClassName()); } 以上根據jndi文檔翻譯的 地址: http://java.sun.com/products/jndi/overview.html tomcat數據庫連接池配置中的 java:comp/env代表你的JVM的環(huán)境,comp=computer env=environment JNDI(The Java Naming and Directory Interface,Java命名和目錄接口)是一組在Java應用中訪(fǎng)問(wèn)命名和目錄服務(wù)的API。命名服務(wù)將名稱(chēng)和對象聯(lián)系起來(lái),使得我們可以用名稱(chēng)訪(fǎng)問(wèn)對象。目錄服務(wù)是一種命名服務(wù),在這種服務(wù)里,對象不但有名稱(chēng),還有屬性。 命名或目錄服務(wù)使你可以集中存儲共有信息,這一點(diǎn)在網(wǎng)絡(luò )應用中是重要的,因為這使得這樣的應用更協(xié)調、更容易管理。例如,可以將打印機設置存儲在目錄服務(wù)中,以便被與打印機有關(guān)的應用使用 JNDI概述 我們大家每天都不知不覺(jué)地使用了命名服務(wù)。例如,當你在web瀏覽器輸入URL,http://java.sun.com時(shí),DNS(Domain Name System,域名系統)將這個(gè)符號URL名轉換成通訊標識(IP地址)。命名系統中的對象可以是DNS記錄中的名稱(chēng)、應用服務(wù)器中的EJB組件(Enterprise JavaBeans Component)、LDAP(Lightweight Directory Access Protocol)中的用戶(hù)Profile。 目錄服務(wù)是命名服務(wù)的自然擴展。兩者之間的關(guān)鍵差別是目錄服務(wù)中對象可以有屬性(例如,用戶(hù)有email地址),而命名服務(wù)中對象沒(méi)有屬性。因此,在目錄服務(wù)中,你可以根據屬性搜索對象。JNDI允許你訪(fǎng)問(wèn)文件系統中的文件,定位遠程RMI注冊的對象,訪(fǎng)問(wèn)象LDAP這樣的目錄服務(wù),定位網(wǎng)絡(luò )上的EJB組件。 對于象LDAP 客戶(hù)端、應用launcher、類(lèi)瀏覽器、網(wǎng)絡(luò )管理實(shí)用程序,甚至地址薄這樣的應用來(lái)說(shuō),JNDI是一個(gè)很好的選擇。 JNDI架構 JNDI架構提供了一組標準的獨立于命名系統的API,這些API構建在與命名系統有關(guān)的驅動(dòng)之上。這一層有助于將應用與實(shí)際數據源分離,因此不管應用 訪(fǎng)問(wèn)的是LDAP、RMI、DNS、還是其他的目錄服務(wù)。換句話(huà)說(shuō),JNDI獨立于目錄服務(wù)的具體實(shí)現,只要你有目錄的服務(wù)提供接口(或驅動(dòng)),你就可以使用目錄。 JNDI是一組API,它用命名/目錄服務(wù)增強了網(wǎng)絡(luò )應用。本文中的示例說(shuō)明了用JNDI開(kāi)發(fā)基于目錄的應用是多么容易。它也說(shuō)明了如何用同樣的API訪(fǎng)問(wèn)不同的命名/目錄服務(wù)。開(kāi)發(fā)者不必學(xué)習不同的API。在某些情況下,例如,在RMI和CORBA應用中,JNDI允許你部署時(shí)才選擇命名服務(wù)。 |
聯(lián)系客服