2.5 用連接池提高Servlet訪問數(shù)據(jù)庫的效率
Java Servlet作為首選的服務(wù)器端數(shù)據(jù)處理技術(shù),正在迅速取代CGI腳本。Servlet超越CGI的優(yōu)勢之一在于,不僅多個請求可以共享公用資源,而且還可以在不同用戶請求之間保留持續(xù)數(shù)據(jù)。本文介紹一種充分發(fā)揮該特色的實用技術(shù),即數(shù)據(jù)庫連接池。
一、實現(xiàn)連接池的意義
動態(tài)Web站點往往用數(shù)據(jù)庫存儲的信息生成Web頁面,每一個頁面請求導(dǎo)致一次數(shù)據(jù)庫訪問。連接數(shù)據(jù)庫不僅要開銷一定的通訊和內(nèi)存資源,還必須完成用戶驗證、安全上下文配置這類任務(wù),因而往往成為最為耗時的操作。當(dāng)然,實際的連接時間開銷千變?nèi)f化,但1到2秒延遲并非不常見。如果某個基于數(shù)據(jù)庫的Web應(yīng)用只需建立一次初始連接,不同頁面請求能夠共享同一連接,就能獲得顯著的性能改善。
Servlet是一個Java類。Servlet引擎(它可能是Web服務(wù)軟件的一部分,也可能是一個獨立的附加模塊)在系統(tǒng)啟動或Servlet第一次被請求時將該類裝入Java虛擬機(jī)并創(chuàng)建它的一個實例。不同用戶請求由同一Servlet實例的多個獨立線程處理。那些要求在不同請求之間持續(xù)有效的數(shù)據(jù)既可以用Servlet的實例變量來保存,也可以保存在獨立的輔助對象中。
用JDBC訪問數(shù)據(jù)庫首先要創(chuàng)建與數(shù)據(jù)庫之間的連接,獲得一個連接對象(Connection),由連接對象提供執(zhí)行SQL語句的方法。本文介紹的數(shù)據(jù)庫連接池包括一個管理類DBConnectionManager,負(fù)責(zé)提供與多個連接池對象(DBConnectionPool類)之間的接口。每一個連接池對象管理一組JDBC連接對象,每一個連接對象可以被任意數(shù)量的Servlet共享。
類DBConnectionPool提供以下功能:
1) 從連接池獲取(或創(chuàng)建)可用連接。
2) 把連接返回給連接池。
3) 在系統(tǒng)關(guān)閉時釋放所有資源,關(guān)閉所有連接。
此外, DBConnectionPool類還能夠處理無效連接(原來登記為可用的連接,由于某種原因不再可用,如超時,通訊問題),并能夠限制連接池中的連接總數(shù)不超過某個預(yù)定值。
管理類DBConnectionManager用于管理多個連接池對象,它提供以下功能:
1) 裝載和注冊JDBC驅(qū)動程序。
2) 根據(jù)在屬性文件中定義的屬性創(chuàng)建連接池對象。
3) 實現(xiàn)連接池名字與其實例之間的映射。
4) 跟蹤客戶程序?qū)B接池的引用,保證在最后一個客戶程序結(jié)束時安全地關(guān)閉所有連接池。
本文余下部分將詳細(xì)說明這兩個類,最后給出一個示例演示Servlet使用連接池的一般過程。
相關(guān)推薦:北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |