国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

非連接行集在基于Java的B/S系統(tǒng)中的應(yīng)用

2010-07-25 08:43:56
微型電腦應(yīng)用 2010年2期
關(guān)鍵詞:本例內(nèi)存頁面

孫 璐

0 引言

MVC設(shè)計(jì)模式被廣泛應(yīng)用于 B/S架構(gòu)的應(yīng)用系統(tǒng)開發(fā),采用MVC設(shè)計(jì)模式,我們可以將表現(xiàn)層、業(yè)務(wù)層分離,構(gòu)建低耦合度的應(yīng)用。采用Java開發(fā)Web應(yīng)用可以采用幾種符合 MVC 設(shè)計(jì)模式的開發(fā)手段,例如JSP(V)-Servlet(C)-JavaBean/EJB(M),或者JSP(V)-JavaBean(C)-JavaBean/EJB(M)等,每種開發(fā)手段各有優(yōu)劣,具體使用要看使用者的習(xí)慣及項(xiàng)目的需求特點(diǎn)[1]。不管何種開發(fā)方式,表現(xiàn)層都是采用JSP實(shí)現(xiàn)。與JavaBean、Servlet、EJB等純采用Java開發(fā)的程序不同,混合了HTML和Java語言(在HTML中會(huì)夾雜著Java語言或JSP標(biāo)記),部署在JSP服務(wù)器后再由服務(wù)器動(dòng)態(tài)編譯為Servlet程序執(zhí)行,原始的 JSP程序的邏輯相對(duì)于純 Java的 JavaBean、Servlet、EJB而言,要混亂的多,是比較容易出錯(cuò)的地方,也是程序調(diào)試的難點(diǎn)。如果是實(shí)現(xiàn)一般功能的JSP程序,問題還不大,但是涉及到數(shù)據(jù)庫應(yīng)用,就比較復(fù)雜了,尤其是查詢類的程序,如果 JSP程序中出現(xiàn)異常,很有可能使得JSP中引用的數(shù)據(jù)連接沒有關(guān)閉,將直接影響后端的數(shù)據(jù)庫服務(wù)器,嚴(yán)重者將使得數(shù)據(jù)庫服務(wù)器因會(huì)話溢出而崩潰[2]。

之所以可能出現(xiàn)這類問題,原因是大多數(shù)使用者在開發(fā)JSP程序時(shí),喜歡使用面向連接的行集對(duì)象ResultSet,面向連接的行集對(duì)象在JSP容器(JSP Container)不緩存數(shù)據(jù)集的內(nèi)容,數(shù)據(jù)集的內(nèi)容緩存在數(shù)據(jù)庫服務(wù)器的相應(yīng)會(huì)話(Session)中,但是使用時(shí),需要一直保持?jǐn)?shù)據(jù)庫連接處于活動(dòng)(Alive)狀態(tài),一旦數(shù)據(jù)庫連接關(guān)閉,該行集就不能再使用。而在JSP中,如果使用行集對(duì)象,則要保證無論在JSP中出現(xiàn)何種預(yù)知或無法預(yù)知的結(jié)果(包括錯(cuò)誤),該JSP程序必須能關(guān)閉數(shù)據(jù)連接,這對(duì)一些比較復(fù)雜的JSP程序而言,相當(dāng)不容易。而本文所述的非連接行集對(duì)象CacheRowSet可以在短暫連接數(shù)據(jù)源并獲取數(shù)據(jù)后,脫離數(shù)據(jù)源而使用(即可以立刻關(guān)閉數(shù)據(jù)連接),解決了這類矛盾。

1 問題的提出

為什么基于Java的B/S數(shù)據(jù)庫應(yīng)用中,當(dāng)數(shù)據(jù)庫連接沒有關(guān)閉時(shí),會(huì)出現(xiàn)上節(jié)提到的數(shù)據(jù)庫會(huì)話溢出的問題呢?Java虛擬機(jī)不是有自動(dòng)垃圾回收(Garbage Collection)的功能嗎?要想回答這個(gè)問題,我們需要對(duì)Java及JDBC作一個(gè)簡(jiǎn)介。

Java是Sun公司推出的Java程序設(shè)計(jì)語言和Java平臺(tái)的總稱。Java語言是一種面向?qū)ο蟮?、解釋型的、多線程的動(dòng)態(tài)語言,與傳統(tǒng)的應(yīng)用程序不同,Java程序采用字節(jié)碼格式,獨(dú)立于操作系統(tǒng)及硬件平臺(tái),運(yùn)行于專用的 Java平臺(tái)之中,良好的可移植性使得其得到了迅速的普及。

Java平臺(tái)由 Java虛擬機(jī)(JVM)和 Java 應(yīng)用編程接口(Java API)構(gòu)成。Java虛擬機(jī)為Java程序提供屏蔽了操作系統(tǒng)與硬件差異的虛擬計(jì)算機(jī)運(yùn)行環(huán)境,在它的隔離下,Java程序不需要從操作系統(tǒng)或硬件平臺(tái)上直接獲取資源(如內(nèi)存、寄存器等),而改由使用JVM提供的資源(字節(jié)碼指令集、JVM寄存器、棧、垃圾回收堆等),Java對(duì)象所需的存儲(chǔ)空間是在垃圾回收堆上分配的,垃圾回收堆為 Java程序中的對(duì)象分配內(nèi)存空間,管理內(nèi)存的使用,并在對(duì)象使用完畢,不再被程序引用時(shí),自動(dòng)將其回收到堆中,Java程序不需要也無法自己控制內(nèi)存的使用。Java API為Java程序提供了一個(gè)獨(dú)立于操作系統(tǒng)的標(biāo)準(zhǔn)編程接口,它本身是使用Java語言編寫的,包括了很多標(biāo)準(zhǔn)的預(yù)定義的類庫,用于支持完成某些功能,如GUI設(shè)計(jì)、I/O、網(wǎng)絡(luò)編程、數(shù)據(jù)庫操作等,可以極大的提高Java程序的開發(fā)效率。Java API已經(jīng)從1.1版發(fā)展到1.6版[3,4]。

JDBC(Java Database Connectivity)即是Java API中的一組包(Package),提供連接各種關(guān)系數(shù)據(jù)庫的統(tǒng)一接口,可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用 Java語言編寫的類和接口組成。其中,包java.sql由JDK1.x開始提供,包括了Connection(數(shù)據(jù)庫連接)、CallableStatement(存儲(chǔ)過程調(diào)用)、PreparedStatement(SQL命令調(diào)用)、ResultSet(面向連接的行集)等接口,包 javax.sql、javax.sql.rowset由JDK1.4開始提供(即JDBC3.0以上),包括 DataSource(數(shù)據(jù)源連接)、RowSet(添加了 JavaBeans屬性)、CachedRowSet(非面向連接行集)、WebRowSet(RowSet的XML文檔格式)等接口[5]。以查詢應(yīng)用為例,如果使用普通的行集對(duì)象,用JDBC開發(fā)的流程一般如下:

1) 創(chuàng)建數(shù)據(jù)庫連接對(duì)象,建立數(shù)據(jù)庫連接,有異常轉(zhuǎn)步驟5;

2) 構(gòu)建查詢SQL語句,有異常轉(zhuǎn)步驟5;

3) 執(zhí)行語句,創(chuàng)建行集對(duì)象,有異常轉(zhuǎn)步驟5;

4) 遍歷行集對(duì)象,顯示數(shù)據(jù),有異常轉(zhuǎn)步驟5;

5) 關(guān)閉數(shù)據(jù)庫連接,釋放連接對(duì)象;

可以看出,程序要求任何時(shí)候都必須通過主動(dòng)關(guān)閉數(shù)據(jù)庫來釋放連接對(duì)象,而不是指望 Java的垃圾自動(dòng)回收機(jī)制起作用,為什么會(huì)這樣呢?并不是 Java的垃圾回收機(jī)制在這種情況下不起作用了,而是 Java的垃圾回收機(jī)制,僅會(huì)回收連接對(duì)象本身(即釋放了JVM宿主的內(nèi)存資源),而不能釋放數(shù)據(jù)庫服務(wù)器上的連接會(huì)話(Connection Sessions)資源。

由于JDBC與數(shù)據(jù)庫服務(wù)器間通過TCP/IP方式通訊,一旦連接,數(shù)據(jù)庫服務(wù)器會(huì)為該連接創(chuàng)建一個(gè)專門的會(huì)話(session)以管理該連接,每個(gè)會(huì)話擁有數(shù)據(jù)庫服務(wù)器分配的一定資源(如內(nèi)存等),用于該會(huì)話所對(duì)應(yīng)的TCP連接上的各項(xiàng)任務(wù)執(zhí)行,如果客戶機(jī)不再需要使用一個(gè)連接,必須顯式地關(guān)閉連接以通知數(shù)據(jù)庫服務(wù)器回收會(huì)話資源,否則,在數(shù)據(jù)庫服務(wù)器上將出現(xiàn)許多處于空閑(Idle)狀態(tài)的會(huì)話,占用數(shù)據(jù)庫服務(wù)器的內(nèi)存資源,并影響數(shù)據(jù)庫服務(wù)器的性能,更有甚者,這種空閑會(huì)話除非數(shù)據(jù)庫服務(wù)器重啟,否則不會(huì)自行回收,一旦達(dá)到上限,數(shù)據(jù)庫服務(wù)器勢(shì)必因內(nèi)存耗盡而無法使用,這就是引言中所指的“會(huì)話溢出”。

當(dāng)然,在程序結(jié)構(gòu)嚴(yán)謹(jǐn)?shù)募?Java的程序中,如 Java Application、Applet、Servlet、JavaBean、EJB等,管理好數(shù)據(jù)庫連接,在所有可能的程序出口顯式關(guān)閉數(shù)據(jù)庫連接并不是什么難事,因此使用面向連接的行集對(duì)象并無不可,還可以減小應(yīng)用服務(wù)器的負(fù)擔(dān),但在混合了 HTML、Java、JSP標(biāo)記、Javascript等的JSP程序中,要做到這一點(diǎn)就不太容易了,頁面越復(fù)雜,打開的行集數(shù)目越多,顯示的數(shù)據(jù)內(nèi)容越分散,頁面中的分支越多,越是容易出現(xiàn)問題,而且當(dāng)頁面程序數(shù)量比較大時(shí)(一個(gè)B/S應(yīng)用系統(tǒng),JSP頁面程序經(jīng)常數(shù)以百計(jì)),非常難定位發(fā)生問題的JSP程序。因?yàn)橐恍┰斐蓴?shù)據(jù)庫連接沒有關(guān)閉而結(jié)束的 JSP程序并不會(huì)在用戶端出現(xiàn)錯(cuò)誤信息,因此使用者往往無法察覺到這類問題,而數(shù)據(jù)庫會(huì)話溢出也需要很長時(shí)間才會(huì)發(fā)生,這主要取決于發(fā)生問題的JSP程序代碼被調(diào)用的次數(shù)、數(shù)據(jù)庫服務(wù)器的內(nèi)存以及B/S系統(tǒng)是否需要長期連續(xù)運(yùn)行,有時(shí)候是幾天,有時(shí)候可能會(huì)是幾周,對(duì)于不需要連續(xù)運(yùn)行的B/S系統(tǒng),這種現(xiàn)象可能永遠(yuǎn)也不會(huì)出現(xiàn)。而一旦發(fā)生了“會(huì)話溢出”,除了重啟數(shù)據(jù)庫服務(wù)器以外,別無它法,這將暫時(shí)中止應(yīng)用系統(tǒng)的服務(wù),對(duì)于提供公眾服務(wù)的B/S應(yīng)用系統(tǒng)而言,將是個(gè)災(zāi)難。

使用 JDBC3.0中提供的非連接行集接口,可以事半功倍地解決上述問題,下面我們以一個(gè)例子展示一下兩種不同行集接口的使用區(qū)別。

2 案例說明

為了方便表述,我們假設(shè)要開發(fā)一個(gè)學(xué)生學(xué)籍管理系統(tǒng),其中有一項(xiàng)功能是根據(jù)查詢條件,查詢符合條件的學(xué)生資料的頁面,數(shù)據(jù)庫服務(wù)器及數(shù)據(jù)結(jié)構(gòu)如表1、2所示:

表1 數(shù)據(jù)庫服務(wù)器信息

表2 表tblStudent數(shù)據(jù)結(jié)構(gòu)

功能要求:可以根據(jù)學(xué)生序號(hào)、學(xué)生學(xué)號(hào)或姓名模糊查詢學(xué)生資料,查詢結(jié)果以列表方式展示。

3 系統(tǒng)設(shè)計(jì)

3.1 設(shè)計(jì)思路

如前文所述,基于Java的B/S應(yīng)用采用MVC設(shè)計(jì)模式開發(fā)有多種實(shí)施手段,為了簡(jiǎn)化設(shè)計(jì),本例采用JSP(View)-JavaBean(Modulel)-JavaBean(Control)方式開發(fā),表3是本例中用到的各程序的說明:

表3 程序說明

因文章篇幅所限,下面僅概略展示本例所涉及程序的方法說明、主要代碼及設(shè)計(jì)的重要部分。

3.2 數(shù)據(jù)庫連接

JdbcDriver.java用于創(chuàng)建及釋放Oracle數(shù)據(jù)庫連接,主要方法包括兩個(gè)[6]:

1) Connection CreateOracleConnection():創(chuàng)建 Oracle數(shù)據(jù)庫連接并返回Connection對(duì)象。

2) boolean FreeConnection(Connection connection):釋放連接。

3.3 查詢條件

查詢條件程序ConditionBean.java是一個(gè)符合JavaBean規(guī)范的 Java程序,本例可作為查詢條件的包括學(xué)生序號(hào)、學(xué)生代碼、學(xué)生姓名,因此對(duì)于每個(gè)條件需要提供一對(duì)set/get方法,如以學(xué)生姓名為例,代碼如下:

3.4 返回結(jié)果

返回結(jié)果程序 ResultBean.java也是一個(gè)符合 JavaBean規(guī)范的 Java程序,本例中因?yàn)橐容^兩種不同行集對(duì)象的應(yīng)用區(qū)別,因此ResultBean.java包含兩個(gè)方法分別輸出兩種行集結(jié)果,代碼如下[7]:

3.5 查詢處理程序

查詢程序的主要邏輯如下:

1) 創(chuàng)建數(shù)據(jù)庫連接;

2) 接收查詢條件,構(gòu)建SQL語句;

3) 執(zhí)行SQL語句,獲取行集對(duì)象;

4) 如果是非連接行集對(duì)象,可以釋放數(shù)據(jù)庫連接并返回行集對(duì)象,否則直接返回行集對(duì)象;

主要代碼如下:

注意上面代碼中的粗斜體部分。

3.6 結(jié)果頁面程序

查詢結(jié)果的顯示在JSP程序中處理,對(duì)于使用連接行集而言,需要在頁面的處理過程中,保持?jǐn)?shù)據(jù)庫連接處于打開狀態(tài),一直到離開頁面才可以以顯式方式釋放數(shù)據(jù)庫連接,而對(duì)于非連接行集就不需要這個(gè)過程了,這樣,程序的處理

邏輯更清晰。因篇幅所限,下面僅給出使用連接行集時(shí)的代碼,注意粗斜體部分的連接釋放處理。

4 結(jié)束語

本文以一個(gè)實(shí)例展示了非連接行集在 B/S系統(tǒng)開發(fā)中的應(yīng)用,事實(shí)上,非連接行集比連接行集更適合數(shù)據(jù)庫查詢一類的應(yīng)用的開發(fā),且系統(tǒng)具有開發(fā)效率高、維護(hù)成本低的優(yōu)點(diǎn),本例的設(shè)計(jì)思想,被筆者在許多應(yīng)用項(xiàng)目中都曾經(jīng)使用過,效果非常不錯(cuò),具有良好的應(yīng)用前景。

[1] 袁梅冷,黃煙波,黃家林,翁艷彬. J2EE應(yīng)用模型中 MVC軟件體系結(jié)構(gòu)的研究與應(yīng)用[J] . 計(jì)算機(jī)應(yīng)用研究,2003,( 3):147-149.

[2] Nourie D. Java Technologies for Web Applications[EB/OL] .Http://java.sun.com/developer/technicalArticles/t ools/webapps_1/, (2006-11-15).

[3] SUN Co. The Java Language Specification, Third Edition[EB/OL] .Http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html, 2005.

[4] SUN Co. Java 2 Platform, Standard Edition, v1.4.2 API specification [EB/OL] . Http://java.sun.com/j2se/1.4.2/docs/api/, 2003.

[5] SUN Co. Getting Started with the JDBC API[EB/OL] .Http://java.sun.com/j2se/1.5.0/docs/guide/jdbc/getstart/Ge ttingStartedTOC.fm.html, 2003.

[6] Oracle Co. Oracle9i Java Developer's Guide, Release 2[M/CD] . Oracle Co. March 2002.

[7] (美)霍斯特曼. JAVA核心技術(shù)卷 II:高級(jí)特性 [M] .陳昊鵬,等譯.北京:機(jī)械工業(yè)出版社,2008: 202-256.

猜你喜歡
本例內(nèi)存頁面
刷新生活的頁面
《思考心電圖之176》答案
《思考心電圖之169》答案
“春夏秋冬”的內(nèi)存
視功能分析圖例詳解
基于內(nèi)存的地理信息訪問技術(shù)
同一Word文檔 縱橫頁面并存
淺析ASP.NET頁面導(dǎo)航技術(shù)
上網(wǎng)本為什么只有1GB?
繞組重繞數(shù)據(jù)的索取
类乌齐县| 郯城县| 同心县| 藁城市| 彝良县| 夏津县| 嘉定区| 白银市| 扶绥县| 台安县| 凌云县| 巍山| 东港市| 郁南县| 渝中区| 剑河县| 呼图壁县| 喀喇沁旗| 阿克| 嘉峪关市| 青铜峡市| 香格里拉县| 辽源市| 九台市| 兴隆县| 岑巩县| 宜阳县| 藁城市| 崇文区| 康马县| 塔河县| 博野县| 囊谦县| 平凉市| 舞钢市| 拜城县| 滕州市| 吕梁市| 阿拉善右旗| 广丰县| 喀喇沁旗|