国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JSP > 正文

JSP數(shù)據(jù)庫連接池的必要性

2024-09-05 00:19:10
字體:
供稿:網(wǎng)友


   最近我作了數(shù)據(jù)庫jsp的頻繁連接,在此給出數(shù)據(jù)庫連接池的必要性,對于jsp來說一個很好的j2ee服務(wù)器是很必要的,jboos,weblogic都是很好的解決方案。


一般情況下,在使用開發(fā)基于數(shù)據(jù)庫的web程序時,傳統(tǒng)的模式基本是按以下步驟:
  1. 在主程序(如servlet、beans)中建立數(shù)據(jù)庫連接。
  2. 進行sql操作,取出數(shù)據(jù)。
  3. 斷開數(shù)據(jù)庫連接。
  使用這種模式開發(fā),存在很多問題。首先,我們要為每一次web請求(例如察看某一篇文章的內(nèi)容)建立一次數(shù)據(jù)庫連接,對于一次或幾次操作來講,或許你覺察不到系統(tǒng)的開銷,但是,對于web程序來講,即使在某一較短的時間段內(nèi),其操作請求數(shù)也遠遠不是一兩次,而是數(shù)十上百次(想想全世界的網(wǎng)友都有可能在您的網(wǎng)頁上查找資料),在這種情況下,系統(tǒng)開銷是相當大的。事實上,在一個基于數(shù)據(jù)庫的web系統(tǒng)中,建立數(shù)據(jù)庫連接的操作將是系統(tǒng)中代價最大的操作之一。很多時候,可能您的網(wǎng)站速度瓶頸就在于此。
  其次,使用傳統(tǒng)的模式,你必須去管理每一個連接,確保他們能被正確關(guān)閉,如果出現(xiàn)程序異常而導(dǎo)致某些連接未能關(guān)閉,將導(dǎo)致數(shù)據(jù)庫系統(tǒng)中的內(nèi)存泄露,最終我們將不得不重啟數(shù)據(jù)庫。
  針對以上問題,我們首先想到可以采用一個全局的connection對象,創(chuàng)建后就不關(guān)閉,以后程序一直使用它,這樣就不存在每次創(chuàng)建、關(guān)閉連接的問題了。但是,同一個連接使用次數(shù)過多,將會導(dǎo)致連接的不穩(wěn)定,進而會導(dǎo)致web server的頻頻重啟。故而,這種方法也不可取。實際上,我們可以使用連接池技術(shù)來解決上述問題。首先,介紹一下連接池技術(shù)的基本原理。顧名思義,連接池最基本的思想就是預(yù)先建立一些連接放置于內(nèi)存對象中以備使用:
 

   
如圖所示,當程序中需要建立數(shù)據(jù)庫連接時,只須從內(nèi)存中取一個來用而不用新建。同樣,使用完畢后,只需放回內(nèi)存即可。而連接的建立、斷開都有連接池自身來管理。同時,我們還可以通過設(shè)置連接池的參數(shù)來控制連接池中的連接數(shù)、每個連接的最大使用次數(shù)等等。通過使用連接池,將大大提高程序效率,同時,我們可以通過其自身的管理機制來監(jiān)視數(shù)據(jù)庫連接的數(shù)量、使用情況等。下面我們以一個名為connectionpool的連接池為例來看看連接池的實現(xiàn)。先看看connectionpool的基本屬性:
  m_connectionpoolsize:連接池中連接數(shù)量下限
  m_connectionpoolmax:連接池中連接數(shù)量上限
  m_connectionusecount:一個連接的最大使用次數(shù)
  m_connectiontimeout:一個連接的最長空閑時間
  m_maxconnections = -1:同一時間的最大連接數(shù)
  m_timer:定時器
  這些屬性定義了連接池與其中的每個連接的有效狀態(tài)值。連接池的自我管理,實際上就是通過定時的對每個連接的狀態(tài)、連接的數(shù)量進行判斷而進行相應(yīng)操作。其管理流程如下:


通過上圖,我們可以定義出connectionpool要完成管理所需要的基本接口:
public class connectionpool implements timerlistener{
  public boolean initialize() //連接池初始化
  public void destroy() //連接池的銷毀
  public synchronized java.sql.connection getconnection() //取一個連接
  public synchronized void close() //關(guān)閉一個連接
  private synchronized void removefrompool() //把一個連接從連接池中刪除
  private synchronized void fillpool() //維護連接池大小
  public synchronized void timerevent() //定時器事件處理函數(shù)
}
  通過這幾個接口,已經(jīng)可以完成連接池的基本管理。在timeevent()函數(shù)中完成連接池的狀態(tài)檢驗工作,fillpool()時連接池至少保持最小連接數(shù)。因為我們要保存每一個連接的狀態(tài),所以還需要一個數(shù)據(jù)庫連接對象:
class connectionobject{
  public java.sql.connection con; public boolean inuse; //是否被使用標志
  public long lastaccess; //最近一次開始使用時間
  public int usecount; //被使用次數(shù)
}
加入了connectionobject對象后,在connectionpool中操作的應(yīng)該只是connectionobject,而其他進程需要的只是connectionobject的con屬性,因此我們再加入一個類,作為其他進程獲得與返回連接的接口: class conn{
  getconnection(); //從連接池中取出一個有效連接
  closeconnection(); //返回連接,此時并沒有關(guān)閉連接,只是放回了連接池
  destroypool(); //銷毀連接池
}
  最后我們的整個系統(tǒng)總的架構(gòu)如下:
     


通過上面的介紹,我們可以看出,連接池技術(shù)的關(guān)鍵就是其自身的管理機制,以上的管理流程只是本人一點見解,關(guān)鍵是想向大家介紹一種思路,在此基礎(chǔ)上,您可以進一步完善連接池技術(shù)為您所用。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 麦盖提县| 景东| 阆中市| 石台县| 建阳市| 广南县| 汝州市| 铁岭县| 陵水| 敦化市| 开远市| 理塘县| 遵义县| 清涧县| 台南县| 石嘴山市| 晋中市| 拉孜县| 揭东县| 安化县| 穆棱市| 墨脱县| 嵊泗县| 衡阳县| 望都县| 鹤岗市| 新余市| 荆州市| 灵川县| 盈江县| 资阳市| 永兴县| 龙江县| 乃东县| 洪泽县| 贵阳市| 西畴县| 贵德县| 赤峰市| 萝北县| 沙河市|