1. 程式人生 > >java連線池

java連線池

連線池相關概念:

 

對於共享資源,有一個很著名的設計模式:資源池(Resource Pool)。該模式正是為了解決資源的頻繁分配﹑釋放所造成的問題。為解決我們的問題,可以採用資料庫連線池技術。資料庫連線池的基本思想就是為資料庫連線建立一個“緩衝池”。預先在緩衝池中放入一定數量的連線,當需要建立資料庫連線時,只需從“緩衝池”中取出一個,使用完畢之後再放回去。我們可以通過設定連線池最大連線數來防止系統無盡的與資料庫連線。更為重要的是我們可以通過連線池的管理機制監視資料庫的連線的數量﹑使用情況,為系統開發﹑測試及效能調整提供依據。

 

為什麼使用連線池

連線,是我們的程式語言與資料庫互動的一種方式。我們經常會聽到這麼一句話“資料庫連線很昂貴“。

有人接受這種說法,卻不知道它的真正含義。因此,下面通過例項解釋它究竟是什麼。

 

下面是MySQL資料庫建立連線的的一段程式碼:

 

 
  1. String connUrl ="jdbc:mysql://your.database.domain/yourDBname";

  2. Class.forName("com.mysql.jdbc.Driver");

  3. Connection con =DriverManager.getConnection (connUrl);

 

 

當我們建立了一個Connection物件,它在內部都執行了什麼:

 

 

1.“DriverManager”檢查並註冊驅動程式;

2.“com.mysql.jdbc.Driver”就是我們註冊了的驅動程式,它會在驅動程式類中呼叫“connect(url…)”方法。

3.com.mysql.jdbc.Driver的connect方法根據我們請求的“connUrl”,建立一個“Socket連線”,連線到IP為“your.database.domain”,預設埠3306的資料庫。

4.建立的Socket連線將被用來查詢我們指定的資料庫,並最終讓程式返回得到一個結果。

簡單的獲取一個連線,系統卻要在背後做很多消耗資源的事情,大多時候,建立連線的時間比執行sql語句的時間還要長。

 

傳統的獲取連線方式如下圖所示:

 

使用者每次請求都需要向資料庫獲得連結,而資料庫建立連線通常需要消耗相對較大的資源,建立時間也較長。假設網站一天10萬訪問量,資料庫伺服器就需要建立10萬次連線,極大的浪費資料庫的資源,並且極易造成資料庫伺服器記憶體溢位、拓機。

 

採用連線池技術後的過程如下:

 

資料庫連線是一種關鍵的有限的昂貴的資源,這一點在多使用者的網頁應用程式中體現的尤為突出。對資料庫連線的管理能顯著影響到整個應用程式的伸縮性和健壯性,影響到程式的效能指標。資料庫連線池負責分配,管理和釋放資料庫連線,它允許應用程式重複使用一個現有的資料庫連線,而不是重新建立一個。

 

需要注意的問題

1、併發問題

為了使連線管理服務具有最大的通用性,必須考慮多執行緒環境,即併發問題。這個問題相對比較好解決,因為各個語言自身提供了對併發管理的支援像java,c#等等,使用synchronized(java)、lock(C#)關鍵字即可確保執行緒是同步的。

2、事務處理

我們知道,事務具有原子性,此時要求對資料庫的操作符合“ALL-OR-NOTHING”原則,即對於一組SQL語句要麼全做,要麼全不做。

我們知道當2個執行緒公用一個連線Connection物件,而且各自都有自己的事務要處理時候,對於連線池是一個很頭疼的問題,因為即使Connection類提供了相應的事務支援,可是我們仍然不能確定那個資料庫操作是對應那個事務的,這是由於我們有2個執行緒都在進行事務操作而引起的。為此我們可以使用每一個事務獨佔一個連線來實現,雖然這種方法有點浪費連線池資源但是可以大大降低事務管理的複雜性。

3、連線池的分配與釋放

連線池的分配與釋放,對系統的效能有很大的影響。合理的分配與釋放,可以提高連線的複用度,從而降低建立新連線的開銷,同時還可以加快使用者的訪問速度。

對於連線的管理可使用一個List。即把已經建立的連線都放入List中去統一管理。每當使用者請求一個連線時,系統檢查這個List中有沒有可以分配的連線。如果有就把那個最合適的連線分配給他(如何能找到最合適的連線文章將在關鍵議題中指出);如果沒有就丟擲一個異常給使用者,List中連線是否可以被分配由一個執行緒來專門管理。

4、連線池的配置與維護

連線池中到底應該放置多少連線,才能使系統的效能最佳?系統可採取設定最小連線數(minConnection)和最大連線數(maxConnection)等引數來控制連線池中的連線。比方說,最小連線數是系統啟動時連線池所建立的連線數。如果建立過多,則系統啟動就慢,但建立後系統的響應速度會很快;如果建立過少,則系統啟動的很快,響應起來卻慢。這樣,可以在開發時,設定較小的最小連線數,開發起來會快,而在系統實際使用時設定較大的,因為這樣對訪問客戶來說速度會快些。最大連線數是連線池中允許連線的最大數目,具體設定多少,要看系統的訪問量,可通過軟體需求上得到。

如何確保連線池中的最小連線數呢?有動態和靜態兩種策略。動態即每隔一定時間就對連線池進行檢測,如果發現連線數量小於最小連線數,則補充相應數量的新連線,以保證連線池的正常運轉。靜態是發現空閒連線不夠時再去檢查。