當你在設計一個資料庫應用程式時,有時你可能覺得資料庫連接類型並不重要,如果真這樣的話你就大錯特錯了,下面列舉出一些原因說明連線類型為什麼是如此重要:
◆相對資料庫應用程式執行的其它任務而言,建立資料庫連接是最消耗系統資源的了
◆開啟資料庫連接時在伺服器端和用戶端消耗的記憶體都是比較多的
◆建立一個串連時需要在伺服器和用戶端之間往返多次
◆串連開啟過多可能造成記憶體不足,引起從記憶體中換頁轉移到磁碟上換頁,這樣效能就會顯著下降
◆以目前流行的架構,大多數應用程式都是使用串連池,這樣效能會有所提升,但許多時候串連池調整不好也會引起效能顯著下降,串連池的設計、調整和監控難度都比較大
實現串連的步驟如下:
◆從串連池獲得一個串連
◆按需要一次只建立一個串連
正確的決策主要依賴於資料庫伺服器的CPU和記憶體條件。
為什麼串連開銷比較大?
開發人員經常認為建立一個資料庫是一個簡單的要求,不就是在資料庫伺服器和初始化使用者之間的一個網路往返嗎,但實際上,一個資料庫連接在驅動和資料庫伺服器之間有多次網路往返,例如,當某個驅動串連到Oracle或Sybase時,這個串連會有7到10和網路往返,執行了一系列的動作:
◆校正使用者的身份認證
◆在資料庫驅動期望的字碼頁設定和資料庫可用的字碼頁設定之間進行協商(如果必要的話)
◆擷取資料庫版本資訊
◆確定用於通訊的最理想的資料庫協議包大小
◆設定會話設定
此外,資料庫管理開發人員承擔資料庫管理員職責時的最佳做法)系統要確定建立串連使用的資源,包括效能開銷較大的磁碟I/O和記憶體配置,你可能會認為將應用程式部署到資料庫伺服器上會消除網路往返,在大多數情況下這並不現實,因為現實世界中大部分企業並不會這麼幹,它們有很多的應用程式,有很多的資料庫,此外,資料庫伺服器都會為資料庫系統進行精心的效能調整,一般不會為不同的應用程式進行調整,即使可以在一台機器上安裝資料庫和應用程式,但這樣也會有單點故障的隱患。
使用串連池
串連池是一個和多個可重複使用的物理資料庫連接的緩衝,串連池可以顯著提高效能,因為重複使用串連可以有效減少建立物理串連的系統開銷,這裡必須要說明的是你的資料庫伺服器必須要有足夠的記憶體來管理串連池中的串連。
我們討論的重點是用戶端串連池(由資料庫驅動和應用程式伺服器提供的串連池)而不是伺服器端的串連池(由資料庫管理系統提供的串連池),有些資料庫管理系統提供的串連池要和用戶端串連池一起工作,雖然不同的伺服器端串連池各有特色,但總體目標都是為了消除建立和移除串連時資料庫伺服器的系統開銷。和用戶端串連池不一樣,伺服器端串連池不會最佳化到應用程式的網路往返。
正如我們在前面提到的,串連到資料庫的系統開銷是比較大的,因為資料庫驅動的資源分派(在驅動和資料庫之間的網路往返)和資料庫伺服器上的資源分派開銷都比較大,用戶端串連池只能解決資料庫伺服器上自由分配的問題。
串連池如何工作
在串連池環境中,一旦建立了初始化物理串連,它就很可能在環境的生命週期內都不會關閉,即當應用程式中斷連線後,物理串連不會關閉,相反,它仍然存在於串連池中,可以被重複使用,因此重建立立串連的速度就更快。下面對串連池如何工作做一個簡單的介紹:
◆當應用程式或應用程式伺服器啟動時,串連池中開始進駐串連;
◆應用程式產生一個串連請求;
◆由驅動或串連池管理器(依賴於你的架構)從串連池中分配一個串連給應用程式,不用再建立新的串連,這意味著在驅動和伺服器之間不會產生網路往返,因為池中的串連是可用的,因此連線速度就更快了;
◆應用程式串連到資料庫;
◆當串連關閉時,它被放回串連池中。
什麼時候不使用串連池
有些應用程式不適合使用串連池,如果你的應用程式具有下列特徵就不適合使用串連池,實際上,在這些應用程式上強制使用串連池反而會導致效能下降:
◆應用程式每天會重新啟動多次:這通常出現在沒有使用應用程式伺服器的架構中,依賴於串連池的配置,應用程式每次啟動時可能都會向串連池寫入一條記錄,這樣反而增加了串連池的系統開銷;
◆單使用者應用程式,如報表書寫程式:如果你的應用程式只需要為一個使用者建立一個串連,這個時候使用串連池就顯得多餘了;
◆運行單使用者批次工作的應用程式,如每日/周/月報告程式:串連池並不適合於批次工作應用程式,因為批次工作往往只有一個串連,而且批次工作往往是在業務低穀期間執行的。
當你的應用程式沒有使用串連池時,最好不要在執行SQL語句時頻繁地串連和中斷連線,因為每次串連都會產生5-10次網路請求。
設計串連
我們以一個實際例子來說明該如何設計資料庫連接,環境詳細情況如下:
◆環境包括的中介層必須支援20-100個並發的資料庫使用者,效能是關鍵
◆中介層和資料庫伺服器上CPU和記憶體都是充足的
◆資料庫是Oracle,SQL Server,Sybase或DB 2
◆應用程式使用的API是ODBC,JDBC或ADO.NET
◆資料庫伺服器有25個串連許可
下面是一些可行的解決方案:
◆解決方案1:使用串連池,最大支援20個串連,每個語句一個串連
◆解決方案2:使用串連池,最大支援5個串連,每5個語句1個串連
每5-25個語句使用一個串連
這個例子中最關鍵是中介層和資料庫伺服器要有足夠的CPU和記憶體容量,同時資料庫伺服器要有足夠的許可,其它資訊都與資料庫連接設計沒什麼關係。
解決方案1是最佳的,它比其它兩個方案都執行得要好,因為每個串連執行一個語句速度更快,解決方案2和3的架構都是多個語句使用一個串連,單個串連會成為瓶頸。
小結
許多因素都會影響到效能,有些可能超出了你的控制範圍,但經過精心設計應用程式和中介層配置,可以使效能趨於理想狀態,在設計應用程式時建議最好使用資料庫連接池或按需要一次建立一個串連。
- DB2資料庫設計的三個建議
- NoSQL真的能終結關聯式資料庫?
- Oracle伺服器參數檔案維護的四個技巧
- 最佳化SQL Server資料庫查詢技巧
- DB2資料庫基本操作指令30條