概念
JNDI(Java Naming and Directory Interface ),類似于在一個中心注冊一個東西,以后要用的時候,只需要根據(jù)名字去注冊中心查找,注冊中心返回你要的東西。web程序,我們可以將一些東西(比如數(shù)據(jù)庫相關(guān)的)交給服務(wù)器軟件去配置和管理(有全局配置和單個web程序的配置),在程序代碼中只要通過名稱查找就能得到我們注冊的東西,而且如果注冊的東西有變,比如更換了數(shù)據(jù)庫,我們只需要修改注冊信息,名稱不改,因此代碼也不需要修改。
String jndiName= ...;
Context context = new InitialContext();
DataSource ds = (DataSourse)context.lookup(jndiName);
由來
JNDI總結(jié)
在Java開發(fā)中,使用JDBC操作數(shù)據(jù)庫的四個步驟如下:
①加載數(shù)據(jù)庫驅(qū)動程序(Class.forName("數(shù)據(jù)庫驅(qū)動類");)
?、谶B接數(shù)據(jù)庫(Connection con = DriverManager.getConnection();)
?、鄄僮鲾?shù)據(jù)庫(PreparedStatement stat = con.prepareStatement(sql);stat.executeQuery();)
④關(guān)閉數(shù)據(jù)庫,釋放連接(con.close();)
也就是說,所有的用戶都需要經(jīng)過此四步進行操作,但是這四步之中有三步(①加載數(shù)據(jù)庫驅(qū)動程序、②連接數(shù)據(jù)庫、④關(guān)閉數(shù)據(jù)庫,釋放連接)對所有人都是一樣的,而所有人只有在操作數(shù)據(jù)庫上是不一樣,那么這就造成了性能的損耗。
那么最好的做法是,準備出一個空間,此空間里專門保存著全部的數(shù)據(jù)庫連接,以后用戶用數(shù)據(jù)庫操作的時候不用再重新加載驅(qū)動、連接數(shù)據(jù)庫之類的,而直接從此空間中取走連接,關(guān)閉的時候直接把連接放回到此空間之中。
那么此空間就可以稱為連接池(保存所有的數(shù)據(jù)庫連接),但是如果要想實現(xiàn)此空間的話,則必須有一個問題要考慮?
1、 如果沒有任何一個用戶使用連接,那么那么應(yīng)該維持一定數(shù)量的連接,等待用戶使用。
2、 如果連接已經(jīng)滿了,則必須打開新的連接,供更多用戶使用。
3、 如果一個服務(wù)器就只能有100個連接,那么如果有第101個人過來呢?應(yīng)該等待其他用戶釋放連接
4、 如果一個用戶等待時間太長了,則應(yīng)該告訴用戶,操作是失敗的。
如果直接用程序?qū)崿F(xiàn)以上功能,則會比較麻煩,所以在Tomcat 4.1.27之后,在服務(wù)器上就直接增加了數(shù)據(jù)源的配置選項,直接在服務(wù)器上配置好數(shù)據(jù)源連接池即可。在J2EE服務(wù)器上保存著一個數(shù)據(jù)庫的多個連接。每一個連接通過DataSource可以找到。DataSource被綁定在了JNDI樹上(為每一個DataSource提供一個名字)客戶端通過名稱找到在JNDI樹上綁定的DataSource,再由DataSource找到一個連接。如下圖所示:

那么在以后的操作中,除了數(shù)據(jù)庫的連接方式不一樣之外,其他的所有操作都一樣,只是關(guān)閉的時候不是徹底地關(guān)閉數(shù)據(jù)庫,而是把數(shù)據(jù)庫的連接放回到連接池中去。
如果要想使用數(shù)據(jù)源的配置,則必須配置虛擬目錄,因為此配置是在虛擬目錄之上起作用的。需要注意的是,如果要想完成以上的功能,在Tomcat服務(wù)器上一定要有各個數(shù)據(jù)庫的驅(qū)動程序。