我們在學習了基本JDBC的操作之後, 如果要更進一步在正式專案使用JDBC,我自己過去的專案經驗是100%都會使用 connection pool 來處理資料庫連線。雖然這已經是一種很普遍的作法,但從學習的角度來看,我們必須知其然,也知其所以然!
JDBC中取得 connection使用後並關閉的流程如下:
- 程式透過 java.sql.DataSource 呼叫 getConnection()
- java.sql.DataSource 使用 JDBC Driver 來連立資料庫連線
- 資料庫驗證使用者帳號、密碼,依照連線參數進行對應的處理
- 建立資料庫連線,開啟一個 TCP socket
- 程式進行資料讀寫
- 程式關閉connection
- 關閉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