楊馥顯,劉嘉勇
(四川大學 電子信息學院,四川 成都 610064)
JSP技術作為一種動態(tài)網(wǎng)頁技術標準[1],與其他傳統(tǒng)開發(fā)技術相比,在易用性、效率、安全性和可移植性[2]方面都有很好的表現(xiàn)。在 Web開發(fā)應用中,與數(shù)據(jù)庫的交互是整個開發(fā)過程中非常重要的一個部分。JSP訪問數(shù)據(jù)庫主要是使用JDBC連接技術來實現(xiàn)。在Web環(huán)境中,如果有大量的用戶頻繁的訪問數(shù)據(jù)庫,那么 JSP和數(shù)據(jù)庫之間交互效率將是整個Web應用中很重要的一個問題。這里針對JSP使用JDBC訪問數(shù)據(jù)庫時的效率問題,提出并實現(xiàn)了數(shù)據(jù)庫連接池的技術。
JSP是Java Server Pages的縮寫,是由Sun公司倡導,于1999年推出,正日益成為開發(fā)Web動態(tài)網(wǎng)站的重要而快速有效地開發(fā)技術。JSP充分利用了Java技術的優(yōu)勢,具有極強的擴展能力和良好的收縮性,與開發(fā)平臺無關,這源于Java的“一次編寫,到處運行”[3]的特點,同時也是一項安全的技術。它具有良好的動態(tài)頁面與靜態(tài)頁面分離的能力,編譯后運行,因而正逐漸成為因特網(wǎng)開發(fā)的主流技術。
在基于JSP開發(fā)的Web系統(tǒng)中,JDBC是程序員和數(shù)據(jù)庫打交道的主要途徑,它提供了完備的數(shù)據(jù)庫操作方法接口。JDBC[4]的全稱為Java DataBase Connection, 是一套面向對象的應用程序接口(API),制定了統(tǒng)一的訪問各類關系數(shù)據(jù)庫的標準接口,為各個數(shù)據(jù)庫廠商提供了標準接口的實現(xiàn)。通過使用JDBC技術,開發(fā)人員可以用純Java語言和標準的SQL語句編寫完整的數(shù)據(jù)庫應用程序,并且真正的實現(xiàn)了軟件的跨平臺性。
JDBC是Java應用程序和數(shù)據(jù)庫溝通的橋梁,通過JSP程序完成與數(shù)據(jù)庫的連接,執(zhí)行相應的數(shù)據(jù)庫操作。程序訪問數(shù)據(jù)庫時,通過JDBC Driver Manager調度取得與要訪問的數(shù)據(jù)庫對應的 JDBC Driver,建立與數(shù)據(jù)庫的連接,然后傳送SQL語句,數(shù)據(jù)庫處理SQL語句以及返回處理的結果。最后,關閉數(shù)據(jù)庫的連接。這個訪問機制的實現(xiàn)過程可以用如圖1總結表示[5]。
圖1 JDBC數(shù)據(jù)庫訪問機制
下面是作者在具體試驗中,使用 JDBC連接數(shù)據(jù)庫的方法,其中用到的數(shù)據(jù)庫是MYSQL5.1,數(shù)據(jù)庫名為project_1,數(shù)據(jù)庫用戶名為root,密碼為1234:
雖然用這種方法成功的連接了數(shù)據(jù)庫并繼續(xù)進行下一步操作,但是上面使用JDBC訪問數(shù)據(jù)庫時,每一次Web請求都要建立一次數(shù)據(jù)庫連接、建立連接是一個費時的活動,每次都得花費0.05~1s的時間[6],而且系統(tǒng)還要分配內(nèi)存資源。這個時間對于一次或幾次數(shù)據(jù)庫操作,或許感覺不出有多大的開銷。可是如果需要頻繁的和數(shù)據(jù)庫交互,則數(shù)據(jù)庫連接操作勢必占用很多的系統(tǒng)資源,而且網(wǎng)站的響應速度必定下降,嚴重的甚至會造成服務器的崩潰。不幸的是,在筆者實際項目實現(xiàn)中,需要和數(shù)據(jù)庫頻繁的交互。在數(shù)據(jù)庫訪問過程中,數(shù)據(jù)量稍微一大,網(wǎng)站響應速度就會明顯慢下來。為了提高訪問效率,筆者使用了數(shù)據(jù)庫連接池技術。
為了解決 JDBC數(shù)據(jù)庫連接時的效率下降、耗時多的缺陷,筆者提出并使用了數(shù)據(jù)庫連接池技術。在JSP中,把連接池技術和 JDBC結合起來使用,就能極大的提高數(shù)據(jù)庫的訪問效率[7]。
連接池的概念是:連接池允許應用程序從連接池中獲得一個連接并使用這個連接,而不需要為每一個連接請求重新建立一個連接。一旦一個新的連接被創(chuàng)建并且放置在連接池中,應用程序就可以重復使用這個連接而不必實施整個數(shù)據(jù)庫連接創(chuàng)建過程。當應用程序請求一個連接時,連接池為該應用程序分配一個連接而不是重新建立一個連接; 當應用程序使用完連接后,該連接被歸還給連接池而不是直接釋放。
數(shù)據(jù)庫連接池的基本思想就是為數(shù)據(jù)庫連接建立一個“緩沖池”。預先在緩沖池中放入一定數(shù)量的連接,當需要建立數(shù)據(jù)庫連接時,只需從“緩沖池”中取出一個,使用完畢之后再放回去??梢酝ㄟ^設定連接池最大連接數(shù)來防止系統(tǒng)無盡的與數(shù)據(jù)庫連接。更為重要的是可以通過連接池的管理機制監(jiān)視數(shù)據(jù)庫的連接的數(shù)量、使用情況,為系統(tǒng)開發(fā)、測試及性能調整提供依據(jù)。連接池的基本工作原理如圖 2所示。
圖2 數(shù)據(jù)庫連接池基本工作原理[8]
在實驗過程中所用的服務器為 TOMBAT6.0。為了實現(xiàn)數(shù)據(jù)庫連接池只需要做以下配置工作:
在實際 Web應用系統(tǒng)的 WebRoot目錄下,新建一個META-INF的目錄(假如不存在),在該目錄下創(chuàng)建一個context.xml文件,并且在context.xml文件中添加以下的配置信息:
其中, name 表示指定的 jndi名稱;auth 表示認證方式,一般為Container;type 表示數(shù)據(jù)源床型,使用標準的javax.sql.DataSource;maxActive 表示連接池當中最大的數(shù)據(jù)庫連接;maxIdle 表示最大的空閑連接數(shù);maxWait當池的數(shù)據(jù)庫連接已經(jīng)被占用的時候,最大等待時間;username 表示數(shù)據(jù)庫用戶名;password 表示數(shù)據(jù)庫用戶的密碼;driverClassName表示JDBC DRIVER;url表示數(shù)據(jù)庫URL地址。
除此之外,需要在應用程序下的web.xml中的<web-app></web-app>之間加入:
至此,在應用中已經(jīng)配置好了數(shù)據(jù)庫的連接池。這里有很重要的一點就是context.xml下的Resource name和web.xml下的<res-ref-name>一定要相同。在筆者項目系統(tǒng)中,為了提高數(shù)據(jù)庫代碼的可重用性[9],筆者用JavaBean封裝數(shù)據(jù)庫連接代碼:
在JSP頁面通過調用JavaBean實現(xiàn)對數(shù)據(jù)庫的訪問。首先,引用該JavaBean的類:
與數(shù)據(jù)庫交互時,只需要在JSP頁面執(zhí)行以下操作:
在實現(xiàn)了連接池之后,整個系統(tǒng)的運行效率有了顯著地提高。滿足了實際工作中的需要。
這里簡單介紹了基于JSP的 Web應用系統(tǒng)中使用JDBC操作連接數(shù)據(jù)庫的相關知識。并且結合實際項目系統(tǒng)中訪問數(shù)據(jù)庫低效率、性能低下無法滿足日益增長地訪問請求的缺點,提出了JSP 和數(shù)據(jù)庫連接池技術相結合的方法,可以使系統(tǒng)的性能明顯得到提高,并在實際工作中運用了連接池技術,提高了數(shù)據(jù)庫訪問效率。
[1] 吳佳,李建民,林振榮.基于JSP的科研成果管理系統(tǒng)的設計與實現(xiàn)[J].通信技術,2008,41(08):210-212.
[2] 韓建寧,高波.數(shù)據(jù)庫連接池在動態(tài) Web網(wǎng)頁開發(fā)中的設計與實現(xiàn)[J].電子設計工程,2009(04):7-9.
[3] 王炎.淺析 JSP技術在動態(tài)網(wǎng)頁技術中的應用[J].商場現(xiàn)代化,2009(07):18.
[4] 明日科技.JSP開發(fā)技術大全[M].北京:人民郵電出版社,2007.
[5] 孫衛(wèi)琴.Tomcat 與Java Web開發(fā)技術詳解[M].北京:電子工業(yè)出版社,2009.
[6] 劉京華.Java Web整合開發(fā)王者歸來(JSP+Servlet+Struts+Hibernate+Spring)[M].北京:清華大學出版社,2010.
[7] 李亞平.JSP和數(shù)據(jù)庫連接池在MVC模式中的應用[J].電腦知識與技術,2009(12):3056,3062.
[8] 李平.基于JSP的動態(tài)網(wǎng)頁開發(fā)技術[J].微計算機信息,2009(21):108-110.
[9] 石國河.網(wǎng)頁設計中 JSP和 ASP技術的應用[J].通信技術,2010,43(02):98-100,104.