日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

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

系統(tǒng) 1899 0

最近我作了數(shù)據(jù)庫JSP的頻繁連接,在此給出數(shù)據(jù)庫連接池的必要性,對(duì)于JSP來說一個(gè)很好的J2EE服務(wù)器是很必要的,JBOOS,WebLogic都是很好的解決方案。


一般情況下,在使用開發(fā)基于數(shù)據(jù)庫的WEB程序時(shí),傳統(tǒng)的模式基本是按以下步驟:
  1. 在主程序(如Servlet、Beans)中建立數(shù)據(jù)庫連接。
  2. 進(jìn)行SQL操作,取出數(shù)據(jù)。
  3. 斷開數(shù)據(jù)庫連接。


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

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


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

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


通過上圖,我們可以定義出ConnectionPool要完成管理所需要的基本接口:
public class ConnectionPool implements TimerListener{
  public boolean initialize() //連接池初始化
  public void destroy() //連接池的銷毀
  public synchronized java.sql.Connection getConnection() //取一個(gè)連接
  public synchronized void close() //關(guān)閉一個(gè)連接
  private synchronized void removeFromPool() //把一個(gè)連接從連接池中刪除
  private synchronized void fillPool() //維護(hù)連接池大小
  public synchronized void TimerEvent() //定時(shí)器事件處理函數(shù)
}
  通過這幾個(gè)接口,已經(jīng)可以完成連接池的基本管理。在TimeEvent()函數(shù)中完成連接池的狀態(tài)檢驗(yàn)工作,fillPool()時(shí)連接池至少保持最小連接數(shù)。因?yàn)槲覀円4婷恳粋€(gè)連接的狀態(tài),所以還需要一個(gè)數(shù)據(jù)庫連接對(duì)象:
class ConnectionObject{
  public java.sql.Connection con; public boolean inUse; //是否被使用標(biāo)志
  public long lastAccess; //最近一次開始使用時(shí)間
  public int useCount; //被使用次數(shù)
}
加入了ConnectionObject對(duì)象后,在ConnectionPool中操作的應(yīng)該只是ConnectionObject,而其他進(jìn)程需要的只是ConnectionObject的con屬性,因此我們?cè)偌尤胍粋€(gè)類,作為其他進(jìn)程獲得與返回連接的接口: CLASS Conn{
  GetConnection(); //從連接池中取出一個(gè)有效連接
  CloseConnection(); //返回連接,此時(shí)并沒有關(guān)閉連接,只是放回了連接池
  DestroyPool(); //銷毀連接池
}
  最后我們的整個(gè)系統(tǒng)總的架構(gòu)如下:

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


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


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

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


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

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


通過上圖,我們可以定義出ConnectionPool要完成管理所需要的基本接口:
public class ConnectionPool implements TimerListener{
  public boolean initialize() //連接池初始化
  public void destroy() //連接池的銷毀
  public synchronized java.sql.Connection getConnection() //取一個(gè)連接
  public synchronized void close() //關(guān)閉一個(gè)連接
  private synchronized void removeFromPool() //把一個(gè)連接從連接池中刪除
  private synchronized void fillPool() //維護(hù)連接池大小
  public synchronized void TimerEvent() //定時(shí)器事件處理函數(shù)
}
  通過這幾個(gè)接口,已經(jīng)可以完成連接池的基本管理。在TimeEvent()函數(shù)中完成連接池的狀態(tài)檢驗(yàn)工作,fillPool()時(shí)連接池至少保持最小連接數(shù)。因?yàn)槲覀円4婷恳粋€(gè)連接的狀態(tài),所以還需要一個(gè)數(shù)據(jù)庫連接對(duì)象:
class ConnectionObject{
  public java.sql.Connection con; public boolean inUse; //是否被使用標(biāo)志
  public long lastAccess; //最近一次開始使用時(shí)間
  public int useCount; //被使用次數(shù)
}
加入了ConnectionObject對(duì)象后,在ConnectionPool中操作的應(yīng)該只是ConnectionObject,而其他進(jìn)程需要的只是ConnectionObject的con屬性,因此我們?cè)偌尤胍粋€(gè)類,作為其他進(jìn)程獲得與返回連接的接口: CLASS Conn{
  GetConnection(); //從連接池中取出一個(gè)有效連接
  CloseConnection(); //返回連接,此時(shí)并沒有關(guān)閉連接,只是放回了連接池
  DestroyPool(); //銷毀連接池
}
  最后我們的整個(gè)系統(tǒng)總的架構(gòu)如下:

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


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

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


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 大兴区| 临漳县| 江永县| 贵德县| 巍山| 望城县| 赣州市| 桂平市| 怀仁县| 城固县| 通许县| 无锡市| 宜黄县| 阜城县| 林州市| 灌阳县| 太谷县| 宁城县| 临漳县| 嘉善县| 云阳县| 尉犁县| 宿州市| 商南县| 万全县| 阿鲁科尔沁旗| 九江市| 博兴县| 清远市| 望城县| 江北区| 三穗县| 潼关县| 洱源县| 长汀县| 凤山市| 商丘市| 吕梁市| 潼南县| 通辽市| 古蔺县|