日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

java 连接池技术_java数据库连接池技术原理(浅析)

發布時間:2024/9/27 数据库 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 连接池技术_java数据库连接池技术原理(浅析) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在執行數據庫SQL語句時,我們先要進行數據連接;而每次創建新的數據庫的連接要消耗大量的資源,這樣,大家就想出了數據庫連接池技術。它的原理是,在運行過程中,同時打開著一定數量的數據庫連接,形成數據連接池,當需要用到數據連接時,就從中取出一個連接,完成某些SQL操作后,系統自動回收,以供其它用戶(或進程)調用。

我們知道,java標準的java.sql.Connection表示一個數據連接。我們封裝了這個類,形成自己的數據庫連接池。為了說明方便,這里用實際的類來顯示:

DBConnectionPool???真正的數據連接池

DBConnectionManager???對多個池進行管理

實際執行過程:

1)??????????新建一個DBConnectionManager類的實例。

2)??????????然后調用DBConnectionManager. CreatePool()創建一個連接池,并把這個連接池加入到pools的HasthTable中。(這種過程可執行多次,對應不同的數據連接,可能是 sql2k的,也可能是oracle的,但生成的DBConnectionPool都要放到pools中進行統一管理,用并用一個名字與相應的 DBConnectionPool對應起來)。

3)??????????當需要數據連接時,首先得到一個DBConnectionPool,然后從DBConnectionPool中看有沒有空閑的連接,如果有,則使用。如果沒有,顯沒過最大連接數,則創建一個Connection連接,并返回這上連接。

4)??????????如果某個連接使用完畢,則調用 DBConnectionManager.freeConnection(String name, Connection con),它又調用DBConnectionPool. freeConnection(Connection con),此時,連接并不真正釋放,而是把這個暫時不用的Connection放到DBConnectionPool的freeConnections數組中(同時,通知其它正在等待連接的線程。這樣,以后要用時,就不用再新建Connection。

淺析(二)

一般情況下,在使用開發基于數據庫的WEB程序時,傳統的模式基本是按以下步驟:

1. 在主程序(如Servlet、Beans)中建立數據庫連接。

2. 進行SQL操作,取出數據。

3. 斷開數據庫連接。

使用這種模式開發,存在很多問題。首先,我們要為每一次WEB請求(例如察看某一篇文章的內容)建立一次數據庫連接,對于一次或幾次操作來講,或許你覺察不到系統的開銷,但是,對于WEB程序來講,即使在某一較短的時間段內,其操作請求數也遠遠不是一兩次,而是數十上百次(想想全世界的網友都有可能在您的網頁上查找資料),在這種情況下,系統開銷是相當大的。事實上,在一個基于數據庫的WEB系統中,建立數據庫連接的操作將是系統中代價最大的操作之一。很多時候,可能您的網站速度瓶頸就在于此。

其次,使用傳統的模式,你必須去管理每一個連接,確保他們能被正確關閉,如果出現程序異常而導致某些連接未能關閉,將導致數據庫系統中的內存泄露,最終我們將不得不重啟數據庫。

針對以上問題,我們首先想到可以采用一個全局的Connection對象,創建后就不關閉,以后程序一直使用它,這樣就不存在每次創建、關閉連接的問題了。但是,同一個連接使用次數過多,將會導致連接的不穩定,進而會導致WEB SERVER的頻頻重啟。故而,這種方法也不可取。實際上,我們可以使用連接池技術來解決上述問題。首先,介紹一下連接池技術的基本原理。顧名思義,連接池最基本的思想就是預先建立一些連接放置于內存對象中以備使用:

如圖所示,當程序中需要建立數據庫連接時,只須從內存中取一個來用而不用新建。同樣,使用完畢后,只需放回內存即可。而連接的建立、斷開都有連接池自身來管理。同時,我們還可以通過設置連接池的參數來控制連接池中的連接數、每個連接的最大使用次數等等。通過使用連接池,將大大提高程序效率,同時,我們可以通過其自身的管理機制來監視數據庫連接的數量、使用情況等。下面我們以一個名為ConnectionPool的連接池為例來看看連接池的實現。先看看 ConnectionPool的基本屬性:

m_ConnectionPoolSize:連接池中連接數量下限

m_ConnectionPoolMax:連接池中連接數量上限

m_ConnectionUseCount:一個連接的最大使用次數

m_ConnectionTimeout:一個連接的最長空閑時間

m_MaxConnections = -1:同一時間的最大連接數

m_timer:定時器

這些屬性定義了連接池與其中的每個連接的有效狀態值。連接池的自我管理,實際上就是通過定時的對每個連接的狀態、連接的數量進行判斷而進行相應操作。其管理流程如下:

通過上圖,我們可以定義出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(); //銷毀連接池

}

最后我們的整個系統總的架構如下:

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

總結

以上是生活随笔為你收集整理的java 连接池技术_java数据库连接池技术原理(浅析)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。