JDBC 再升級 — 使用 connection pool

我們在學習了基本JDBC的操作之後, 如果要更進一步在正式專案使用JDBC,我自己過去的專案經驗是100%都會使用 connection pool 來處理資料庫連線。雖然這已經是一種很普遍的作法,但從學習的角度來看,我們必須知其然,也知其所以然!

JDBC中取得 connection使用後並關閉的流程如下:

  1. 程式透過 java.sql.DataSource 呼叫 getConnection()
  2. java.sql.DataSource 使用 JDBC Driver 來連立資料庫連線
  3. 資料庫驗證使用者帳號、密碼,依照連線參數進行對應的處理
  4. 建立資料庫連線,開啟一個 TCP socket
  5. 程式進行資料讀寫
  6. 程式關閉connection
  7. 關閉TCP socket

從上面的流程可以看出,connection 的建立與關閉對於資料庫來說,是頗耗費系統資源的工作,而我們的應用程式又必須等待取得 connection 之後才有辦法與資料庫互動,換句說說,如果在程式裡面有大量的 connection 建立與關閉,可以預期這樣對於程式的執行效能會有不小的衝擊

connection pool 的功能是作為 connection 的「快取區」,基本的使用流程是在程式一啟動就向資料庫建立一定數量的連線(依設定),並存放於 pool 裡,後續程式 getConnection()時是直接向 connection pool  取用,用完後呼叫 connection.close() 就會放回 pool

使用 connection pool 的好處,整理如下:

  • 降低向資料庫建立 connection  的頻率
  • pool 中的 connection 可重複使用
  • 程式呼叫 getConnection() 是直接向 pool 取得 connection,速度上比建立新的 connection 還快的多
  • connection pool 有許多設定可以幫助我們管理 pool 裡面的connection ,比如設置初始的連線數、最大連線數、connection 閒置處理…等等,適當的設定這些參數可以提升建立/取用 connection 的效率,也能減輕資料庫建立連線的負擔
  • connection pool 可作為資料庫前方的「緩衝區」:當程式需要取用大量連線時,這些請求都會由 connection pool 依設定好的策略來處理,不會一下子拖垮資料庫運行效能

下一篇將透過簡單的例子來讓大家了解使用 connection pool 前後的效能差異,以及比較一下現在流行的幾種 connection pool 實作

Facebook Comments