程序員開發時,知道要開發訪問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.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數據庫,
如下:
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) ...{}
}
}
MySQLDS
jdbc:MySQL://localhost:3306/lw
com.MySQL.jdbc.Driver
root
rootpassWord
org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter
MySQL
這裡,定義了一個名為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();
......
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避免了程序與數據庫之間的緊耦合,使應用更加易於配置、易於部署。