標籤: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名稱空間儲存和檢索對象
- import javax.naming.*;
- public void createName() throws NamingException {
- Context context= new InitialContext();
- context.bind("/config/applicationName", "MyApp");
- }
- public String getName() throws NamingException {
- Context context= new InitialContext();
- return (String)context.lookup("/config/applicationName");
- }
J2EE之JNDI