數(shù)據(jù)庫連接的分配和回收方法
【技術領域】
[0001]本發(fā)明涉及數(shù)據(jù)庫連接的分配和回收方法。
【背景技術】
[0002]隨著互聯(lián)網(wǎng)的不斷發(fā)展,互聯(lián)網(wǎng)上的數(shù)據(jù)量急劇增長,傳統(tǒng)單機數(shù)據(jù)庫在處理大規(guī)模數(shù)據(jù)時已經(jīng)面臨明顯的瓶頸,各大互聯(lián)網(wǎng)公司都著手研宄分布式數(shù)據(jù)庫的實現(xiàn)方案。
[0003]在分布式數(shù)據(jù)庫的實現(xiàn)方案中,包括如下兩類:一類是客戶端的解決方案,引入一個新的客戶端,對數(shù)據(jù)進行分片處理;另一類是引入數(shù)據(jù)庫中間件,對數(shù)據(jù)的分片處理由該中間件完成,應用程序只需要訪問該數(shù)據(jù)庫中間件即可,整個訪問過程和訪問原生的數(shù)據(jù)庫幾乎一樣。
[0004]在數(shù)據(jù)庫中間件的解決方案中,針對MySQL的中間件的解決方案相對來說比較多,在實現(xiàn)MySQL中間件的時候需要解決的一個非常重要的一點就是中間件對MySQL連接的管理問題,即連接池的設計與實現(xiàn)。
[0005]一般在解決中間件與MySQL實例的連接問題的解決方案主要有兩種:
[0006]以數(shù)據(jù)庫為單位,每個數(shù)據(jù)庫建立一個連接池;
[0007]以MySQL實例為單位,一個MySQL實例上可能有多個數(shù)據(jù)庫,彼此之間共享所有的連接。
[0008]以數(shù)據(jù)庫為單位建立連接池的方式存在的不足是:一個MySQL實例本身能承受的連接總數(shù)是有限的,且同一個MySQL實例上往往有多個數(shù)據(jù)庫,而各個數(shù)據(jù)庫的訪問量一般來說是不一樣的,有些數(shù)據(jù)庫可能訪問量較大有些數(shù)據(jù)庫可能訪問量很小甚至長時間不被訪問,在以數(shù)據(jù)庫為單位建立連接池的時候很難預先準確分配各個數(shù)據(jù)庫的連接數(shù)。因為不能準確的以數(shù)據(jù)庫分配連接數(shù),導致的問題就是某些數(shù)據(jù)庫對應的連接池經(jīng)常長期空閑卻又消耗MySQL實例上的連接資源,而有些數(shù)據(jù)庫對應的連接池資源緊張卻又無法將其他數(shù)據(jù)庫對應的連接池中的空閑連接資源利用起來,同時因為數(shù)據(jù)庫為單位分配連接對MySQL實例上的連接總數(shù)的控制也不方便,簡單的說就是連接資源利用不充分。
[0009]傳統(tǒng)的以MySQL實例為單位建立連接池的方式存在的不足:一個MySQL實例上可能存在多個數(shù)據(jù)庫,而通過中間件訪問MySQL的時候,可能隨機訪問其中的一些數(shù)據(jù)庫,所以某些連接可能剛訪問了數(shù)據(jù)庫A,返回給連接池以后又從連接池中拿出來去訪問數(shù)據(jù)庫B,為了保證訪問的正確性,每次訪問之前都需要確認某個連接和某個數(shù)據(jù)庫是對應的,也就是說需要在進行SQL操作之前進行一次use db的操作,該操作會保證該連接和對應的數(shù)據(jù)庫關聯(lián)上,而該操作會增加一次中間件到MySQL實例之間的網(wǎng)絡10,從而導致訪問性能下降。
【發(fā)明內(nèi)容】
[0010]本發(fā)明的目的是解決中間件方案的連接池實現(xiàn)方法里存在的問題,即MySQL連接資源利用不充分及訪問性能降低的問題。
[0011]根據(jù)本發(fā)明的一個方面,提供一種利用數(shù)據(jù)庫連接池分配連接的方法,所述數(shù)據(jù)庫連接池包括全局連接池和邏輯連接池,所述全局連接池包括全局隊列,所述邏輯連接池包括各數(shù)據(jù)庫對應的隊列,所述方法包括步驟:接收連接請求,該連接請求包含對應數(shù)據(jù)庫的數(shù)據(jù)庫名;當所述邏輯連接池中存在該數(shù)據(jù)庫對應的隊列并且該隊列非空,則從該隊列中取得一個連接,并同時將該連接從該隊列中和全局隊列中移除,并且返回該連接;當所述邏輯連接池中不存在該數(shù)據(jù)庫對應的隊列或者盡管存在但該隊列為空,則確定所述全局隊列是否為空;當所述全局隊列非空,則取出所述全局隊列的尾部的連接,建立并保存該連接與所述數(shù)據(jù)庫的對應關系,并且返回該連接,其中當存在該連接與其他數(shù)據(jù)庫的對應關系時,解除該連接與該其他數(shù)據(jù)庫的對應關系;當所述全局隊列為空,則判定當前活動連接數(shù)是否大于預定的閾值;當活動連接數(shù)不大于預定的閾值,則創(chuàng)建新的連接,建立并保存該連接與所述數(shù)據(jù)庫的對應關系,并且返回該連接;當活動連接數(shù)大于預定的閾值,則發(fā)出連接數(shù)報警。
[0012]根據(jù)本發(fā)明上述方面的一個優(yōu)選的方式,該方法還包括如下步驟:確定是否有彈性連接額度,當有彈性連接額度可使用,則創(chuàng)建新的連接,建立并保存該連接與所述數(shù)據(jù)庫的對應關系,并且返回該連接;當沒有彈性連接額度,則返回獲取連接失敗的異常消息。
[0013]根據(jù)本發(fā)明的又一方面,提供一種利用數(shù)據(jù)庫連接池回收連接的方法,所述數(shù)據(jù)庫連接池包括全局連接池和邏輯連接池,所述全局連接池包括全局隊列,所述邏輯連接池包括各數(shù)據(jù)庫對應的隊列,所述方法包括步驟:接收釋放給所述數(shù)據(jù)庫連接池的連接,并獲取該連接對應的數(shù)據(jù)庫的信息;確定連接池連接總數(shù)是否已經(jīng)達到預定連接數(shù)閾值;當所述連接池連接數(shù)大于等于所述連接數(shù)閾值,則關閉該連接;當所述連接池連接數(shù)小于所述連接數(shù)閾值并且所述邏輯連接池中存在該連接對應的數(shù)據(jù)庫的隊列,則把該連接置于該數(shù)據(jù)庫的隊列的尾部,并且把該連接置于所述全局隊列的頭部;當當前連接池連接數(shù)小于所述連接數(shù)閾值并且所述邏輯連接池中不存在該連接對應的數(shù)據(jù)庫的隊列,則為該數(shù)據(jù)庫創(chuàng)建隊列,把該隊列添加到所述邏輯連接池中,把該連接置于該隊列的尾部,并且把該連接置于所述全局隊列的頭部。
[0014]根據(jù)本發(fā)明的優(yōu)選實施方式,所述全局隊列是鏈表或數(shù)組。
[0015]根據(jù)本發(fā)明的優(yōu)選實施方式,所述全局隊列采用LRU鏈表的形式。
[0016]根據(jù)本發(fā)明的優(yōu)選實施方式,所述邏輯連接池包括的隊列是數(shù)組。
【附圖說明】
[0017]下面將參考附圖詳細地描述本發(fā)明的實施例,其中:
[0018]圖1是本發(fā)明的兩層連接池結構的示意圖;
[0019]圖2是本發(fā)明的連接池初始化的流程圖;
[0020]圖3是本發(fā)明的連接池單元分配連接的流程圖;
[0021]圖4是本發(fā)明的連接池單元回收連接的流程圖。
【具體實施方式】
[0022]當應用要訪問分布式數(shù)據(jù)庫系統(tǒng)中的數(shù)據(jù)庫時,需要建立數(shù)據(jù)庫連接(databaseconnect1n),使得可對數(shù)據(jù)庫進行存取,如通過SQL操作對數(shù)據(jù)庫中的數(shù)據(jù)進行查詢、增加、修改和刪除,并且在操作完成后關閉數(shù)據(jù)庫連接。對于一個復雜的數(shù)據(jù)庫應用,頻繁的建立、關閉數(shù)據(jù)庫,會極大的降低系統(tǒng)的性能,增大系統(tǒng)的開銷,甚至成為系統(tǒng)的瓶頸。數(shù)據(jù)庫連接成為一種有限的昂貴資源。
[0023]為了合理利用數(shù)據(jù)庫連接這種資源,產(chǎn)生了數(shù)據(jù)庫連接池技術。連接池技術的基本的思想是在系統(tǒng)初始化的時候,將數(shù)據(jù)庫連接作為對象來建立并存儲在內(nèi)存中,當應用請求訪問數(shù)據(jù)庫時,并非建立一個新的連接,而是從連接池中取出一個已建立的空閑連接分配給該請求。使用完畢后,應用也并非將連接關閉,而是將連接釋放回連接池中,以供下一個請求來使用。而連接的建立、關閉都由連接池自身來管理。同時,還可以通過設置連接池的參數(shù)來控制連接池中的初始連接數(shù)、連接的上下限數(shù)以及每個連接的最大使用次數(shù)、最大空閑時間等等。通過在應用之間共享連接,而不是在需要連接的時候再建立,就可以改善資源使用,提高應用的響應能力。
[0024]根據(jù)本發(fā)明,采用分層模式來實現(xiàn)一種數(shù)據(jù)庫連接池,使得既可控制連接的總數(shù)又能對各個數(shù)據(jù)庫合理的分配連接,同時又盡可能的減少網(wǎng)絡1次數(shù)。
[0025]根據(jù)本發(fā)明的數(shù)據(jù)庫連接池包括全局連接池和邏輯連接池兩部分。圖1是本發(fā)明數(shù)據(jù)庫連接池的結構圖示。
[0026]根據(jù)本發(fā)明的優(yōu)選實施例,全局連接池是一個隊列,稱為全局隊列,例如全局隊列采用LRU鏈表的形式,每個連接是LRU鏈表中的一個元素。利用LRU鏈表,可以保證剛使用過的連接一定位于該鏈表的頭部,即作為第一個元素,而鏈表的尾部元素是未被使用或者空閑時間較長的連接。
[0027]隊列的有序特性保證了從連接池中獲取連接的時候,如果出現(xiàn)某個數(shù)據(jù)庫對應的連接池隊列中的連接數(shù)不夠時,可以通過全局連接池快速找到最不活躍的數(shù)據(jù)庫對應的連接池隊列中的連接或者是從未被使用連接,從而保證了各個數(shù)據(jù)庫間連接資源的充分利用。
[0028]邏輯連接池由各個數(shù)據(jù)庫對應的隊列構成。數(shù)據(jù)庫對應的隊列以普通的鏈表或者數(shù)組的形式構成。
[0029]邏輯連接池中各個數(shù)據(jù)庫對應的隊列中的連接與全局連接池的隊列中的連接是一樣的,即邏輯連接池中各個數(shù)據(jù)庫對應的隊列中的連接一定是位于全局連接池的隊列中的連接,但全局連接池的隊列中的連接不一定都出現(xiàn)在邏輯連接池中。
[0030]如圖1所示,數(shù)據(jù)庫DBl對應的連接池隊列中有兩個連接,這兩個連接分別是全局連接池的全局隊列中的第一個連接和第二個連接,數(shù)據(jù)庫DB2對應的隊列中有一個連接,該連接對應全局隊列中的第三個連接。全局隊列中的第四個連接和第五個連接因為還沒有被使用過,所以不屬于邏輯連接池中的任何一個數(shù)據(jù)庫對應的隊列。
[0031]根據(jù)本發(fā)明的連接池管理單元主要完成三個方面的工作,分別是:
[0032]初始化連接池,
[0033]分配連接,以及
[0034]回收連接。
[0035]下面就這三個方面進行詳細說明。
[0036](I)初始化連接池
[0037]當數(shù)據(jù)庫中間件啟動或者重新加載配置時,需要對連接池做初始化工作。
[0038]對連接池要設置一些參數(shù),比如:
[0039]連接池的總的連接數(shù)額度,
[0040]連接池最小初始化連接數(shù),以及
[0041]彈性連接數(shù)額度等。
[0042]根據(jù)這些參數(shù)設置進行相應的初始化工作。
[0043]因連接池是分層連接池,在初始化的時候會根據(jù)最小初始化連接數(shù)來創(chuàng)建連接,新創(chuàng)建的連接在初始化的時候只放在全局連接池中,邏輯連接池中是空的。整個初始化流程如圖2所不。
[0044](2)分配連接
[004