楊馥顯,劉嘉勇
(四川大學(xué) 電子信息學(xué)院,四川 成都 610064)
JSP技術(shù)作為一種動(dòng)態(tài)網(wǎng)頁技術(shù)標(biāo)準(zhǔn)[1],與其他傳統(tǒng)開發(fā)技術(shù)相比,在易用性、效率、安全性和可移植性[2]方面都有很好的表現(xiàn)。在 Web開發(fā)應(yīng)用中,與數(shù)據(jù)庫的交互是整個(gè)開發(fā)過程中非常重要的一個(gè)部分。JSP訪問數(shù)據(jù)庫主要是使用JDBC連接技術(shù)來實(shí)現(xiàn)。在Web環(huán)境中,如果有大量的用戶頻繁的訪問數(shù)據(jù)庫,那么 JSP和數(shù)據(jù)庫之間交互效率將是整個(gè)Web應(yīng)用中很重要的一個(gè)問題。這里針對(duì)JSP使用JDBC訪問數(shù)據(jù)庫時(shí)的效率問題,提出并實(shí)現(xiàn)了數(shù)據(jù)庫連接池的技術(shù)。
JSP是Java Server Pages的縮寫,是由Sun公司倡導(dǎo),于1999年推出,正日益成為開發(fā)Web動(dòng)態(tài)網(wǎng)站的重要而快速有效地開發(fā)技術(shù)。JSP充分利用了Java技術(shù)的優(yōu)勢(shì),具有極強(qiáng)的擴(kuò)展能力和良好的收縮性,與開發(fā)平臺(tái)無關(guān),這源于Java的“一次編寫,到處運(yùn)行”[3]的特點(diǎn),同時(shí)也是一項(xiàng)安全的技術(shù)。它具有良好的動(dòng)態(tài)頁面與靜態(tài)頁面分離的能力,編譯后運(yùn)行,因而正逐漸成為因特網(wǎng)開發(fā)的主流技術(shù)。
在基于JSP開發(fā)的Web系統(tǒng)中,JDBC是程序員和數(shù)據(jù)庫打交道的主要途徑,它提供了完備的數(shù)據(jù)庫操作方法接口。JDBC[4]的全稱為Java DataBase Connection, 是一套面向?qū)ο蟮膽?yīng)用程序接口(API),制定了統(tǒng)一的訪問各類關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)接口,為各個(gè)數(shù)據(jù)庫廠商提供了標(biāo)準(zhǔn)接口的實(shí)現(xiàn)。通過使用JDBC技術(shù),開發(fā)人員可以用純Java語言和標(biāo)準(zhǔn)的SQL語句編寫完整的數(shù)據(jù)庫應(yīng)用程序,并且真正的實(shí)現(xiàn)了軟件的跨平臺(tái)性。
JDBC是Java應(yīng)用程序和數(shù)據(jù)庫溝通的橋梁,通過JSP程序完成與數(shù)據(jù)庫的連接,執(zhí)行相應(yīng)的數(shù)據(jù)庫操作。程序訪問數(shù)據(jù)庫時(shí),通過JDBC Driver Manager調(diào)度取得與要訪問的數(shù)據(jù)庫對(duì)應(yīng)的 JDBC Driver,建立與數(shù)據(jù)庫的連接,然后傳送SQL語句,數(shù)據(jù)庫處理SQL語句以及返回處理的結(jié)果。最后,關(guān)閉數(shù)據(jù)庫的連接。這個(gè)訪問機(jī)制的實(shí)現(xiàn)過程可以用如圖1總結(jié)表示[5]。

圖1 JDBC數(shù)據(jù)庫訪問機(jī)制
下面是作者在具體試驗(yàn)中,使用 JDBC連接數(shù)據(jù)庫的方法,其中用到的數(shù)據(jù)庫是MYSQL5.1,數(shù)據(jù)庫名為project_1,數(shù)據(jù)庫用戶名為root,密碼為1234:

雖然用這種方法成功的連接了數(shù)據(jù)庫并繼續(xù)進(jìn)行下一步操作,但是上面使用JDBC訪問數(shù)據(jù)庫時(shí),每一次Web請(qǐng)求都要建立一次數(shù)據(jù)庫連接、建立連接是一個(gè)費(fèi)時(shí)的活動(dòng),每次都得花費(fèi)0.05~1s的時(shí)間[6],而且系統(tǒng)還要分配內(nèi)存資源。這個(gè)時(shí)間對(duì)于一次或幾次數(shù)據(jù)庫操作,或許感覺不出有多大的開銷。可是如果需要頻繁的和數(shù)據(jù)庫交互,則數(shù)據(jù)庫連接操作勢(shì)必占用很多的系統(tǒng)資源,而且網(wǎng)站的響應(yīng)速度必定下降,嚴(yán)重的甚至?xí)斐煞?wù)器的崩潰。不幸的是,在筆者實(shí)際項(xiàng)目實(shí)現(xiàn)中,需要和數(shù)據(jù)庫頻繁的交互。在數(shù)據(jù)庫訪問過程中,數(shù)據(jù)量稍微一大,網(wǎng)站響應(yīng)速度就會(huì)明顯慢下來。為了提高訪問效率,筆者使用了數(shù)據(jù)庫連接池技術(shù)。
為了解決 JDBC數(shù)據(jù)庫連接時(shí)的效率下降、耗時(shí)多的缺陷,筆者提出并使用了數(shù)據(jù)庫連接池技術(shù)。在JSP中,把連接池技術(shù)和 JDBC結(jié)合起來使用,就能極大的提高數(shù)據(jù)庫的訪問效率[7]。
連接池的概念是:連接池允許應(yīng)用程序從連接池中獲得一個(gè)連接并使用這個(gè)連接,而不需要為每一個(gè)連接請(qǐng)求重新建立一個(gè)連接。一旦一個(gè)新的連接被創(chuàng)建并且放置在連接池中,應(yīng)用程序就可以重復(fù)使用這個(gè)連接而不必實(shí)施整個(gè)數(shù)據(jù)庫連接創(chuàng)建過程。當(dāng)應(yīng)用程序請(qǐng)求一個(gè)連接時(shí),連接池為該應(yīng)用程序分配一個(gè)連接而不是重新建立一個(gè)連接; 當(dāng)應(yīng)用程序使用完連接后,該連接被歸還給連接池而不是直接釋放。
數(shù)據(jù)庫連接池的基本思想就是為數(shù)據(jù)庫連接建立一個(gè)“緩沖池”。預(yù)先在緩沖池中放入一定數(shù)量的連接,當(dāng)需要建立數(shù)據(jù)庫連接時(shí),只需從“緩沖池”中取出一個(gè),使用完畢之后再放回去。可以通過設(shè)定連接池最大連接數(shù)來防止系統(tǒng)無盡的與數(shù)據(jù)庫連接。更為重要的是可以通過連接池的管理機(jī)制監(jiān)視數(shù)據(jù)庫的連接的數(shù)量、使用情況,為系統(tǒng)開發(fā)、測(cè)試及性能調(diào)整提供依據(jù)。連接池的基本工作原理如圖 2所示。

圖2 數(shù)據(jù)庫連接池基本工作原理[8]
在實(shí)驗(yàn)過程中所用的服務(wù)器為 TOMBAT6.0。為了實(shí)現(xiàn)數(shù)據(jù)庫連接池只需要做以下配置工作:
在實(shí)際 Web應(yīng)用系統(tǒng)的 WebRoot目錄下,新建一個(gè)META-INF的目錄(假如不存在),在該目錄下創(chuàng)建一個(gè)context.xml文件,并且在context.xml文件中添加以下的配置信息:

其中, name 表示指定的 jndi名稱;auth 表示認(rèn)證方式,一般為Container;type 表示數(shù)據(jù)源床型,使用標(biāo)準(zhǔn)的javax.sql.DataSource;maxActive 表示連接池當(dāng)中最大的數(shù)據(jù)庫連接;maxIdle 表示最大的空閑連接數(shù);maxWait當(dāng)池的數(shù)據(jù)庫連接已經(jīng)被占用的時(shí)候,最大等待時(shí)間;username 表示數(shù)據(jù)庫用戶名;password 表示數(shù)據(jù)庫用戶的密碼;driverClassName表示JDBC DRIVER;url表示數(shù)據(jù)庫URL地址。
除此之外,需要在應(yīng)用程序下的web.xml中的<web-app></web-app>之間加入:


至此,在應(yīng)用中已經(jīng)配置好了數(shù)據(jù)庫的連接池。這里有很重要的一點(diǎn)就是context.xml下的Resource name和web.xml下的<res-ref-name>一定要相同。在筆者項(xiàng)目系統(tǒng)中,為了提高數(shù)據(jù)庫代碼的可重用性[9],筆者用JavaBean封裝數(shù)據(jù)庫連接代碼:

在JSP頁面通過調(diào)用JavaBean實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的訪問。首先,引用該JavaBean的類:

與數(shù)據(jù)庫交互時(shí),只需要在JSP頁面執(zhí)行以下操作:

在實(shí)現(xiàn)了連接池之后,整個(gè)系統(tǒng)的運(yùn)行效率有了顯著地提高。滿足了實(shí)際工作中的需要。
這里簡(jiǎn)單介紹了基于JSP的 Web應(yīng)用系統(tǒng)中使用JDBC操作連接數(shù)據(jù)庫的相關(guān)知識(shí)。并且結(jié)合實(shí)際項(xiàng)目系統(tǒng)中訪問數(shù)據(jù)庫低效率、性能低下無法滿足日益增長(zhǎng)地訪問請(qǐng)求的缺點(diǎn),提出了JSP 和數(shù)據(jù)庫連接池技術(shù)相結(jié)合的方法,可以使系統(tǒng)的性能明顯得到提高,并在實(shí)際工作中運(yùn)用了連接池技術(shù),提高了數(shù)據(jù)庫訪問效率。
[1] 吳佳,李建民,林振榮.基于JSP的科研成果管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].通信技術(shù),2008,41(08):210-212.
[2] 韓建寧,高波.數(shù)據(jù)庫連接池在動(dòng)態(tài) Web網(wǎng)頁開發(fā)中的設(shè)計(jì)與實(shí)現(xiàn)[J].電子設(shè)計(jì)工程,2009(04):7-9.
[3] 王炎.淺析 JSP技術(shù)在動(dòng)態(tài)網(wǎng)頁技術(shù)中的應(yīng)用[J].商場(chǎng)現(xiàn)代化,2009(07):18.
[4] 明日科技.JSP開發(fā)技術(shù)大全[M].北京:人民郵電出版社,2007.
[5] 孫衛(wèi)琴.Tomcat 與Java Web開發(fā)技術(shù)詳解[M].北京:電子工業(yè)出版社,2009.
[6] 劉京華.Java Web整合開發(fā)王者歸來(JSP+Servlet+Struts+Hibernate+Spring)[M].北京:清華大學(xué)出版社,2010.
[7] 李亞平.JSP和數(shù)據(jù)庫連接池在MVC模式中的應(yīng)用[J].電腦知識(shí)與技術(shù),2009(12):3056,3062.
[8] 李平.基于JSP的動(dòng)態(tài)網(wǎng)頁開發(fā)技術(shù)[J].微計(jì)算機(jī)信息,2009(21):108-110.
[9] 石國河.網(wǎng)頁設(shè)計(jì)中 JSP和 ASP技術(shù)的應(yīng)用[J].通信技術(shù),2010,43(02):98-100,104.