程序員開發時,知道要開發訪問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) ...{}
}
}
<?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>
jndi是一種名錄服務,EJB,JMS也會用到JNDI。。。。它不只是能用在數據庫連接上面
【fengmingjie】:
Java Database Connectivity (JDBC)是一個標準的Java API,它由一組類和接口組成,Java應用程序開發人員使用它來訪問數據庫和執行SQL語句
JNDI(Java Name Directory Interface),可不僅僅是進行數據庫定位的,
它是給當前應用服務器所管理的所有資源一個唯一的標識,包括數據庫,網頁,文件,
連接池等等。