摘要:在簡要介紹了JSP數據庫連接技術的基本原理和實現方法的基礎上,提出了在數據存儲、正確選擇驅動程序、使用連接池技術及代碼優化等方面改進數據訪問效率的措施。
關鍵詞:JSP;數據庫;連接池
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)24-1283-02
Research on Performance Optimization of Database Accessing Technologies in JSP
SHENG Zhong-biao
(Department of Computer Science, Weinan Teachers College, Weinan 714000, China)
Abstract: The article first introduces the basic principle and the way how to use the database connection technology of JSP. And then put forward the method of database access based on data storage, the correct choice of JDBC, the technology of connection pool and the optimization about code.
Key words: JSP; database; connection pool.
1 前言
目前,基于B/S模式的三層或多層開發模式,已成為開發Web應用普遍采用的方法。在B/S架構的系統中,應用系統要頻繁訪問數據庫,連接數據庫需要用戶驗證,使用以后又要確保它們被正確關閉。因此連接數據庫是一種耗時的操作,對數據庫的高效訪問成為Web應用的關鍵所在[1]。
2 JSP中數據庫訪問技術
2.1 JDBC數據庫訪問機制
JSP中對數據庫的訪問是通過JDBC實現的。JDBC是由SUN 公司制定的Java數據庫連接技術的簡稱。用來支持獨立于任何特定SQL實現的基本SQL功能,提供數據庫訪問的基本功能。JDBC的一個主要特點就是數據庫的互操作性。即就是通過使用JDBC API來進行數據庫訪問,可以在不修改應用程序的情況下,改變所使用的數據庫驅動程序(或數據庫引擎)。
2.2 JDBC的功能結構
圖1為JDBC功能結構圖。JDBC的結構分為兩層:面向開發人員的JDBC API和面向底層的JDBC Driver API。

2.3 JDBC驅動程序的類型[2]
1)JDBC-ODBC橋和ODBC驅動程序。
2)JDBC網絡驅動,為適應應用服務器與數據庫服務器分離的結構而提供的方式。
3)數據庫協議驅動程序,該方式將JDBC與一種通用數據庫協議驅動程序相連,利用中間件和協議解釋器將該協議驅動程序與某種具體的數據庫系統相連。
4)本地數據庫專用驅動程序。
3 性能優化方法
3.1 數據存儲方面
在數據的存取方面,采用JSP/Servlet+JDBC的技術。Web服務器主要負責接收本地或遠程瀏覽器的HTTP數據請求,中間層的Servlet收到請求,利用JDBC提供的標準API對數據庫進行訪問和相應的操作處理。Servlet再將查詢的數據傳給JSP,最后生成標準的JSP頁面將結果返回給提出請求的瀏覽器。這樣,不僅將客戶端與數據庫服務器端分開,同時提高了數據庫的訪問效率。
3.2 正確選擇JDBC驅動程序
3.2.1 JDBC驅動程序分析
驅動程序1:這種方式借用了現成的ODBC驅動程序,方便了開發人員。但是這種方式增加了一個中間層次,使得訪問數據庫的效率和可靠性有所下降,而且有些驅動程序不是多線程的,不適合在要求并行訪問數據庫和數據庫驅動程序的情況下使用。
驅動程序2:這種類型的驅動程序把對JDBC的調用轉化成對DBMS直接使用的網絡協議,從而允許Java客戶端直接訪問DBMS。這類驅動程序性能最好,但是只能訪問一種數據庫。
驅動程序3:這種類型的驅動程序使用不依賴于具體DBMS的網絡協議而是與中間服務器通信。
驅動程序4:這種類型的驅動程序不是純JAVA驅動程序,此類驅動程序也必須在本地計算機上先安裝好特定的驅動程序,然后通過JDBC-NativeAPI Bridge 的轉換,把Java程序中使用的JDBC API 轉換成Native API,進而存取數據庫。這種方法效率比第一類驅動程序效率雖然高一些,但仍然需要在每臺客戶機上預先安裝本地API庫,因此不利于維護和使用。
3.2.2 JDBC驅動程序選擇
綜上所述最佳的JDBC驅動程序類型是第二類,它不會增加任何額外的開銷,并且由純Java語言開發而成,擁有最佳的兼容性。第三類JDBC驅動程序也是不錯的選擇,它也是由純Java 語言開發而成的,并且中間件也僅需要在服務器上安裝。因此,建議最好以第二類和第三類JDBC驅動程序為主要選擇。
3.3 使用連接池技術
3.3.1 建立連結池的必要性
Web應用程序的訪問,要面對并發問題。隨著用戶數量的增加,當前面的用戶請求尚未處理完畢時,后面的請求已經到來的可能性就會大大增加。讓應用程序在某一時刻只接受一條數據庫請求是不現實的。
通常采用的方法有兩個:1)為每一個請求建立新的數據庫鏈接;2)在JSP初始化時,創建一個單獨的數據庫連接。但是這兩種方法都可能導致系統內存不足,資源耗盡。
連接池技術是目前被認為最合適的解決數據庫連接問題的方法,它在設計上是一種互相沖突的需求的折衷。這里復雜性和資源,性能和效率得到了很好的均衡。
3.3.2 連接池實現
連接池技術最基本的思想就是預先建立一些連接放置于內存對象中以備使用。當程序中需要建立連接時,只需從內存中取一個來用而不用新建[4]。同樣,使用完畢后,只需放回內存即可。
在實際應用中,通過連接池管理程序設置連接的最大數目,控制著同一時刻有多少并發請求可以被同時處理。所有當前的請求都被連接池管理程序按順序鎖定。這些請求線程的鎖定時通過高層應用程序代碼進行的。一旦某個JSP將連接交還給了連接池,那么管理程序就會立刻將其分配給鎖定隊列中的下一個請求。這樣就需要建立一個好的連接池管理程序,在編寫死鎖-釋放、并發訪問等管理代碼時必須考慮所有可能的并發問題。
下面給出實現connectionPool的JavaBean如下:
//查詢完整的SQL語句
public ResultSet query(String strquery){
try{
con = poolConn.getConnection();
stat = con.createStatement();
ResultSet result = stat.executeQuery(strquery);
return result;
}catch(SQLException e){
e.printStackTrace();
return 1;
}finally{
poolConn.returnConnection(con);
}
}
//提交數據庫的更改請求
public int update(String strquery){
try{
con = poolConn.getConnection();
stat = con.createStatement();
stat.executeUpdate(strquery);
return 1;
}catch(SQLException e){
return 0;
}
finally{
poolConn.returnConnection(con);
} }
通過這樣的封裝,內部模塊的耦合性得到了降低,用戶只需要根據sql語句的性質,分別調用query(sql)和update(sql)兩個函數即可完成數據庫的操作,而無需考慮如何建立和釋放連接,以及是否使用連接池等等細節。
3.4 程序中SQL語句格式的優化
JSP中訪問數據庫時,如果多次在普通Statement 對象執行SQL語句,命令每次都要被數據庫進行解析和編譯。而使用PreparedStatement對象時,由于PreparedStatement對象不僅包含了SQL語句,而且大多數情況下這個語句已經編譯。因而當其執行時,只需DBMS運行SQL語句,而不必先編譯。因而,可大大降低運行時間,當然也加快了數據庫訪問的速度。
3.5 JavaBeans封裝對數據庫的操作
JavaBean是一種可以重用的Java組件,它的最大優點是可以實現代碼的重復利用,并且當更換后臺數據庫時,不必修改JSP 頁面,只需要在JavaBean 中改變驅動程序以及連接方法,有利于程序的維護。JavaBean的工作原理是將數據庫基本的處理邏輯封裝在JavaBean包中,通過JSP調用JavaBean實現數據庫的連接。
4 結論
數據庫訪問的性能優化對提高系統可用性和效率有著非常重要的意義。在實際開發中針對不同的客戶需求和應用環境選取合適JDBC驅動程序;在編碼過程中使用連接池技術;優化SQL 查詢語句;以及數據庫結構的優化都會提升應用程序的效率。當然實際操作中的經驗積累也是提高JSP數據庫訪問性能的重要方面,只有針對具體的開發要求和開發環境,進而采取相應的措施,才能得到較為滿意的數據訪問效率。
參考文獻:
[1] Kevin M,Todd L,Jhon C.Java數據庫應用程序編程指南[M].北京:電子工業出版社,2002。
[2] 吳興興,高保祿,董志鋒,等.網絡數據庫應用實例[M].北京:人民郵電出版社,2000:155-157.
[3] 宋善德,郭飛.基于Java的Web數據庫連接池技術的研究[J].計算機工程與應用,2002,(8):201-206.
[4] 楊紹方.深入掌握J2EE編程技術[M].北京:科學出版社,2002.
[5] Annunziato J.JSP速成教程[M].北京:機械工業出版社,2002.
[6] 耿祥義,張躍平.JSP基礎教程[M].北京:清華大學出版社,2004.