欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

JSP數據庫連接池的必要性

系統 1769 0

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


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


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

JSP數據庫連接池的必要性


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

JSP數據庫連接池的必要性


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

JSP數據庫連接池的必要性


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


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

JSP數據庫連接池的必要性


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

JSP數據庫連接池的必要性


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

JSP數據庫連接池的必要性


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

JSP數據庫連接池的必要性


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产做国产爱免费视频 | 国产精品毛片久久久久久久 | 韩国理论午夜 | 国内精品久久久久久久久久久久 | 国产高清精品一区 | 岛国色情A片无码视频免费看 | 国产在线小视频 | 天天操天天操天天操 | 国产精品揄拍100视频最近 | 色偷偷噜噜噜亚洲男人 | 成人欧美s视频在线观看 | naruto henta | 日韩经典中文字幕 | 亚洲国产aⅴ成人精品无吗 最新国产网址 | 成人在线免费 | 国产精品 第1页 | 久久久久亚洲精品 | 免费福利视频在线观看 | 免费一级片在线观看 | ww1515hh海外永久360 | A片扒开双腿猛进入免费观看 | 久久伊人久久 | 亚洲成aⅴ人在线观看 | 99久久99久久免费精品蜜桃 | 午夜小视频免费观看 | 黄色特级一级片 | 国产精品色 | 国产精品久久久久无码人妻精品 | www国产成人免费观看视频,深夜成人网 | 久久伊人色综合 | 久久久久久久久国产 | 日韩欧美亚洲一区 | 免费播放欧美一级特黄 | 亚洲国产午夜精品乱码 | 中文字幕在线精品 | 黑人黄色大片 | 毛片啪啪啪 | 久操青青| 久草色香蕉| 日日碰狠狠躁久久躁婷婷 | 狠狠干奇米 |