1. 程式人生 > >關於PHP資料庫連線池

關於PHP資料庫連線池

在最近一個專案中,為了統一資料介面,搭建可擴充套件性較強的程式架構,CTO要求構建一個數據庫中間層,實現對數 據的統一操作,所有的資料請求都通過這個中間層來分發,其


實也就是相當於建立一個數據庫連線池,最後寫一個統一的資料介面,這個問題在java中可以輕鬆 搞定,因為java有很多開源的比較成熟的資料庫連線池程式,而且java本身也支


持這種物件對映,可是PHP實現起來就非常的麻煩,甚至是一項不可能完 成的任務。
其實,有一個開源的資料庫連線池程式可以使用:sqlrelay,它支援的資料庫非常多,常見的 MySQL,mssql/oracle都自不用說,不過這個程式的效率卻一直廣受詬病,也為它的


推廣使用帶來了很多障礙。尤其國內應用的非常少,幾乎沒有 什麼中文的使用感受和文件可用,操作sqlrelay的class也只有陶峰寫過一個。拋開效率不談,sqlrelay還是非常優


秀的,至少是一個不錯的 選擇。


關於sqlrelay的安裝配置和使用方法,本站將另文詳述。本文重點在於掃盲,介紹一下資料庫連線池的基本知 識。


資料庫連線池的工作機制是什麼?它怎麼提高資料的訪問速度呢?  
---------------------------------------------------------------  


連線池的作用主要是節省開啟資料庫的時間。  
由於開啟資料庫連線比較耗時,所以連線池機制預先開啟N個數據庫連線,把它們快取起來,當需要使用資料庫的時候就直接使用這些已經開啟的連線,從而節省了 時間。 
---------------------------------------------------------------  
 
建立新的物件並初始化的操作,可能會消耗很多的時間。在這種物件的初始化工作包含了一些費時的操作(例如,從一臺位於20,000千米以外的主機上讀出一 些資料)的時候,尤


其是這樣。在需要大量生成這樣的物件的時候,就可能會對效能造成一些不可忽略的影響。要緩解這個問題,除了選用更好的硬體和更棒的虛擬 機以外,適當地採用一些能夠減少


物件建立次數的編碼技巧,也是一種有效的對策。物件池化技術(Object Pooling)就是這方面的著名技巧.  


物件池化的基本思路是:將用過的物件儲存起來,等下一次需要這種物件的時候,再拿出來重複使用,從而在一定程度上減少頻繁建立物件所造成的開銷。用於充當 儲存物件的“


容器”的物件,被稱為“物件池”(Object Pool,或簡稱Pool)。  


資料庫連線pool是專門儲存和管理資料庫連線的pool.  


恰當地使用物件池化技術,可以有效地減少物件生成和初始化時的消耗,提高系統的執行效率。  


採用物件池化的本意,是要通過減少物件生成的次數,減少花在物件初始化上面的開銷,從而提高整體的效能。然而池化處理本身也要付出代價,因此,並非任何情 況下都適合採


用物件池化。    


基本上,只在重複生成某種物件的操作成為影響效能的關鍵因素的時候,才適合進行物件池化。如果進行池化所能帶來的效能提高並不重要的話,還是不採用物件池 化技術,以保


持程式碼的簡明,而使用更好的硬體和更棒的虛擬機器來提高效能為佳。    


恰當地使用物件池化,可以有效地降低頻繁生成某些物件所造成的開銷,從而提高整體的效能。而藉助Jakarta Commons  Pool元件,可以有效地減少花在處理物件池化上的工作量


,進而,向其它重要的工作裡,投入更多的時間和精力。


資料庫連線池的原理:


J2EE伺服器啟動時會建立一定數量的池連線,並一直維持不少於此數目的池連線。
客戶端程式需要連線時,池驅動程式會返回一個未使用的池連線並將其表記為忙。
如果當前沒有空閒連線,池驅動程式就新建一定數量的連線,新建連線的數量有配置引數決定。
當使用的池連線呼叫完成後,池驅動程式將此連線表記為空閒,其他呼叫就可以使用這個連線。