一種數(shù)據(jù)庫連接處理方法及裝置制造方法
【專利摘要】本發(fā)明公開了一種數(shù)據(jù)庫連接處理方法及裝置,屬于數(shù)據(jù)通信【技術(shù)領(lǐng)域】。所述方法包括:接收到客戶端的數(shù)據(jù)庫連接請求時,判斷連接池的連接隊列的長度是否小于預設(shè)門限,其中,所述連接隊列中存儲有與用戶名相關(guān)聯(lián)的數(shù)據(jù)庫連接;當所述連接隊列的長度大于等于預設(shè)門限時,從所述連接隊列中取出一個數(shù)據(jù)庫連接;判斷客戶端使用的用戶名與取出的數(shù)據(jù)庫連接的用戶名是否相同;若相同,將該數(shù)據(jù)庫連接分配給客戶端使用,否則,通知服務端對客戶端進行認證,并在認證通過后將該數(shù)據(jù)庫連接分配給客戶端使用。本發(fā)明實現(xiàn)了多用戶權(quán)限隔離的前提下,避免數(shù)據(jù)庫連接總數(shù)的不斷上升,節(jié)省了連接池耗費的服務器資源。
【專利說明】一種數(shù)據(jù)庫連接處理方法及裝置
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及數(shù)據(jù)通信【技術(shù)領(lǐng)域】,具體涉及一種數(shù)據(jù)庫連接處理方法及裝置。
【背景技術(shù)】
[0002]在數(shù)據(jù)庫應用中,客戶端的每一次數(shù)據(jù)訪問請求都需要經(jīng)歷與服務端建立數(shù)據(jù)庫連接、打開數(shù)據(jù)庫、存取數(shù)據(jù)和關(guān)閉數(shù)據(jù)庫連接等步驟,而連接并打開數(shù)據(jù)庫是一件既消耗資源又費時的工作,如果頻繁發(fā)生這種數(shù)據(jù)庫操作,系統(tǒng)的性能必然會急劇下降。數(shù)據(jù)庫連接池技術(shù)是在存取數(shù)據(jù)操作完成后,并不關(guān)閉數(shù)據(jù)庫連接,而是將其存儲起來,下一個數(shù)據(jù)庫操作請求就可以直接使用這個數(shù)據(jù)庫連接,通過復用已建立的數(shù)據(jù)庫連接,能夠極大地節(jié)省系統(tǒng)資源和數(shù)據(jù)庫操作時間。
[0003]在使用數(shù)據(jù)庫連接池技術(shù)時,連接池中要預先保留一定數(shù)量的數(shù)據(jù)庫連接,如果數(shù)量太大會對服務端造成負擔,數(shù)量太小則數(shù)據(jù)庫連接數(shù)可能不夠用??蛻舳税l(fā)來數(shù)據(jù)庫連接請求時,連接池模塊會檢查當前連接的總數(shù),若未達到“預留數(shù)量”,則會向服務端申請新建一個數(shù)據(jù)庫連接,使用完后放入連接池的連接隊列中以供下次使用;若已經(jīng)達到“預留數(shù)量”,則不會新建連接,而是從連接隊列中取出一個數(shù)據(jù)庫連接分配給該客戶端使用,使用完后重新放回隊列。
[0004]客戶端與服務端建立連接時,會經(jīng)歷以下幾個階段:連接、握手、認證、認證結(jié)果。連接指客戶端去連接(connect)服務端的監(jiān)聽端口,然后服務端會發(fā)送一個握手包給客戶端,客戶端在認證階段將用戶名和密碼發(fā)給服務端,服務端驗證密碼是否正確后,將認證結(jié)果返回給客戶端。經(jīng)歷以上四個階段后,一個數(shù)據(jù)庫連接被建立起來,客戶端接下來可以發(fā)送SQL語句給服務端,服務端執(zhí)行SQL語句后,把執(zhí)行結(jié)果返回給客戶端。
[0005]每個連接是與某個用戶綁定在一起的,而每個用戶的權(quán)限不同,一個用戶只能訪問所有它具有權(quán)限的庫和表,A用戶訪問不了 B用戶的數(shù)據(jù),反之亦然。這一點就會影響到連接池對數(shù)據(jù)庫連接的存儲設(shè)計,連接池一般把數(shù)據(jù)庫連接存儲在隊列結(jié)構(gòu)里。如果直接把所有用戶的數(shù)據(jù)庫連接都放入一個隊列,那么客戶端A(使用A用戶名)在需要執(zhí)行SQL語句時,就有可能取出客戶端B (使用B用戶名)認證過的數(shù)據(jù)庫連接,從而使得A用戶可以訪問B用戶的數(shù)據(jù),造成用戶權(quán)限的混亂。
[0006]一個最直觀的避免用戶權(quán)限混亂的想法是:將屬于不同用戶名的數(shù)據(jù)庫連接分別存入不同的連接隊列,比如A用戶的數(shù)據(jù)庫連接存入A隊列,B用戶的數(shù)據(jù)庫連接存入B隊列,并且記錄每個客戶端所使用的用戶名。在某個客戶端需要從連接池里取數(shù)據(jù)庫連接來使用時,根據(jù)所存儲的該客戶端使用的用戶名,從相應的連接隊列里取出一個數(shù)據(jù)庫連接,分配給該客戶端使用,使用完畢后重新放入到對應的連接隊列。
[0007]以上方案的缺點是無法控制連接總數(shù)的上漲。再來回顧一下客戶端與服務端建立連接的四個階段:連接、握手、認證、認證結(jié)果。其中在前兩個階段,客戶端并沒有發(fā)送自身所使用的用戶名,而是在第三個階段即認證階段,才會把用戶名和密碼發(fā)出來。而連接池模塊在連接階段,就已經(jīng)需要根據(jù)連接總數(shù)是否達到“預留數(shù)量”來決定是新建連接還是復用連接了。
[0008]舉個例子:連接池的“預留數(shù)量”設(shè)為64,如果多個用戶名的連接共享同一個存儲隊列,則當有客戶端來連接時,連接池模塊只需要判斷這個共享的隊列的長度,就可以得到目前池內(nèi)的連接數(shù)量,然后與64比較,若小于64則向服務端新建連接,若大于等于64,則從池內(nèi)取出一個連接給客戶端使用。
[0009]現(xiàn)在改成了每個用戶名擁有自己的連接隊列,不妨設(shè)有A和B兩個用戶名,A隊列長度為64 (已經(jīng)達到“預留數(shù)量”個連接),而B隊列長度為I (只有I個連接,遠低于“預留數(shù)量”)。現(xiàn)在有客戶端來連接,而且在這個階段還沒有發(fā)送用戶名過來,那么連接池應該如何決定是新建連接還是復用連接呢?有兩個可能的原則:一是所有隊列都低于64才新建連接,帶來的問題是B用戶始終只有I個連接(因為A用戶已經(jīng)達到了 64個連接),很可能不夠用導致客戶端報錯,因此這種方式不可行;二是有一個隊列低于64就新建連接,這種方式問題也很嚴重,試想,如果A用戶不斷來連接,因為B用戶連接數(shù)少就新建連接,建好連接后發(fā)現(xiàn)是A用戶的連接,就放入A隊列,導致A隊列長度越來越大,連接數(shù)不斷上漲,“預留數(shù)量”的限制已經(jīng)無用。
[0010]從以上分析可以看出,根據(jù)現(xiàn)有的連接池實現(xiàn)方案,當所有用戶名共享一個連接隊列時,A用戶可能會從隊列中取出B用戶的連接,導致用戶權(quán)限混亂;而當每個用戶名使用自己的隊列來存儲連接時,又會造成連接總數(shù)的不斷上升,導致服務端的資源消耗過大。
【發(fā)明內(nèi)容】
[0011]鑒于上述問題,提出了本發(fā)明以便提供一種克服上述問題或者至少部分地解決上述問題的數(shù)據(jù)庫連接處理方法及裝置。
[0012]依據(jù)本發(fā)明的一個方面,提供了一種數(shù)據(jù)庫連接處理方法,用于客戶端與服務端之間,所述方法包括:
[0013]接收到客戶端的數(shù)據(jù)庫連接請求時,判斷連接池的連接隊列的長度是否小于預設(shè)門限,其中,所述連接隊列中存儲有與用戶名相關(guān)聯(lián)的數(shù)據(jù)庫連接;
[0014]當所述連接隊列的長度大于等于預設(shè)門限時,從所述連接隊列中取出一個數(shù)據(jù)庫連接;
[0015]判斷客戶端使用的用戶名與取出的數(shù)據(jù)庫連接的用戶名是否相同;
[0016]當客戶端使用的用戶名與取出的數(shù)據(jù)庫連接的用戶名相同時,將該數(shù)據(jù)庫連接分配給客戶端使用;當客戶端使用的用戶名與取出的數(shù)據(jù)庫連接的用戶名不同時,通知服務端對客戶端進行認證,并在認證通過后將該數(shù)據(jù)庫連接分配給客戶端使用。
[0017]可選地,所述方法還包括:
[0018]當所述連接隊列的長度小于預設(shè)門限時,向服務端申請新建一個數(shù)據(jù)庫連接;
[0019]將新建的數(shù)據(jù)庫連接分配給客戶端使用,并記錄客戶端使用的用戶名信息。
[0020]可選地,所述方法還包括:在客戶端使用完數(shù)據(jù)庫連接后,將該數(shù)據(jù)庫連接及關(guān)聯(lián)的用戶名加入到所述連接隊列中。
[0021]可選地,所述通知服務端對客戶端進行認證,包括:
[0022]構(gòu)造一個切換用戶命令,所述切換用戶命令中包括客戶端使用的用戶名及密碼信息;[0023]在將客戶端的數(shù)據(jù)庫操作請求發(fā)送到服務端之前,將所述切換用戶命令發(fā)送到服務端,以使服務端根據(jù)所述切換用戶命令中的用戶名和密碼信息對客戶端進行認證。
[0024]可選地,所述切換用戶命令為MySQL數(shù)據(jù)庫的COM_CHANGE_USER命令。
[0025]根據(jù)本發(fā)明的另一方面,提供了一種數(shù)據(jù)庫連接處理裝置,用于客戶端與服務端之間,所述裝置包括:
[0026]第一判斷單元,適于接收到客戶端的數(shù)據(jù)庫連接請求時,判斷連接池的連接隊列的長度是否小于預設(shè)門限,其中,所述連接隊列中存儲有與用戶名相關(guān)聯(lián)的數(shù)據(jù)庫連接;
[0027]第一處理單元,適于當所述連接隊列的長度大于等于預設(shè)門限時,從所述連接隊列中取出一個數(shù)據(jù)庫連接;
[0028]第二判斷單元,適于判斷客戶端使用的用戶名與取出的數(shù)據(jù)庫連接的用戶名是否相同;
[0029]第二處理單元,適于當客戶端使用的用戶名與取出的數(shù)據(jù)庫連接的用戶名相同時,將該數(shù)據(jù)庫連接分配給客戶端使用;當客戶端使用的用戶名與取出的數(shù)據(jù)庫連接的用戶名不同時,通知服務端對客戶端進行認證,并在認證通過后將該數(shù)據(jù)庫連接分配給客戶端使用。
[0030]可選地,所述裝置還包括第三處理單元,所述第三處理單元適于:
[0031]當所述連接隊列的長度小于預設(shè)門限時,向服務端申請新建一個數(shù)據(jù)庫連接;
[0032]將新建的數(shù)據(jù)庫連接分配給客戶端使用,并記錄客戶端使用的用戶名信息。
[0033]可選地,所述裝置還包括第四處理單元,所述第四處理單元適于在客戶端使用完數(shù)據(jù)庫連接后,將該數(shù)據(jù)庫連接及關(guān)聯(lián)的用戶名加入到所述連接隊列中。
[0034]可選地,所述第二處理單元進一步適于:
[0035]構(gòu)造一個切換用戶命令,所述切換用戶命令中包括客戶端使用的用戶名及密碼信息;
[0036]在將客戶端的數(shù)據(jù)庫操作請求發(fā)送到服務端之前,將所述切換用戶命令發(fā)送到服務端,以使服務端根據(jù)所述切換用戶命令中的用戶名和密碼信息對客戶端進行認證。
[0037]可選地,所述切換用戶命令為MySQL數(shù)據(jù)庫的COM_CHANGE_USER命令。
[0038]根據(jù)本發(fā)明提供的上述技術(shù)方案,當客戶端使用的用戶名與從連接池的連接隊列取出的數(shù)據(jù)庫連接的用戶名不同時,通知服務端對客戶端進行認證,在認證通過后再將該數(shù)據(jù)庫連接分配給客戶端使用,這樣,通過將一個用戶認證過的數(shù)據(jù)庫連接轉(zhuǎn)化為另一個用戶認證過的數(shù)據(jù)庫連接,再配合多用戶共享的連接隊列,實現(xiàn)了多用戶權(quán)限隔離的前提下,避免了數(shù)據(jù)庫連接總數(shù)的不斷上升,節(jié)省了連接池耗費的服務器資源。
[0039]上述說明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說明書的內(nèi)容予以實施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點能夠更明顯易懂,以下特舉本發(fā)明的【具體實施方式】。
【專利附圖】
【附圖說明】
[0040]通過閱讀下文優(yōu)選實施方式的詳細描述,各種其他的優(yōu)點和益處對于本領(lǐng)域普通技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實施方式的目的,而并不認為是對本發(fā)明的限制。而且在整個附圖中,用相同的參考符號表示相同的部件。在附圖中:[0041 ]圖1示出了本發(fā)明實施例的應用場景;
[0042]圖2示出了根據(jù)本發(fā)明一個實施例的數(shù)據(jù)庫連接處理方法流程圖;
[0043]圖3示出了根據(jù)本發(fā)明一個實施例的數(shù)據(jù)庫連接處理方法的詳細流程圖;
[0044]圖4示出了根據(jù)本發(fā)明一個實施例的數(shù)據(jù)庫連接處理裝置結(jié)構(gòu)圖。
【具體實施方式】
[0045]下面將參照附圖更詳細地描述本公開的示例性實施例。雖然附圖中顯示了本公開的示例性實施例,然而應當理解,可以以各種形式實現(xiàn)本公開而不應被這里闡述的實施例所限制。相反,提供這些實施例是為了能夠更透徹地理解本公開,并且能夠?qū)⒈竟_的范圍完整的傳達給本領(lǐng)域的技術(shù)人員。
[0046]圖1示出了本發(fā)明實施例的應用場景。在圖1所示的應用場景中,包括多個客戶端(圖中示出了 2個,分別為客戶端一和客戶端二)、連接池模塊和服務端,服務端中具有客戶端需要訪問和操作的數(shù)據(jù)庫,圖中示出的是MySQL數(shù)據(jù)庫,當然也可以是其他類型的數(shù)據(jù),連接池模塊位于客戶端和服務端之間。
[0047]圖2示出了根據(jù)本發(fā)明一個實施例的數(shù)據(jù)庫連接處理方法流程圖,所述方法用于客戶端與服務端之間,例如,由客戶端與服務端之間的連接池模塊來執(zhí)行該方法。參照圖2,所述方法包括:
[0048]步驟202,接收到客戶端的數(shù)據(jù)庫連接請求時,判斷連接池的連接隊列的長度是否小于預設(shè)門限,其中,所述連接隊列中存儲有與用戶名相關(guān)聯(lián)的數(shù)據(jù)庫連接;
[0049]客戶端在進行每一次數(shù)據(jù)庫操作請求前都需要請求一個數(shù)據(jù)庫連接,連接池接收到客戶端的數(shù)據(jù)庫連接請求時,首先獲取連接隊列的長度,連接隊列的長度表示了連接池中存儲的數(shù)據(jù)庫連接的數(shù)量。在本發(fā)明實施例中,采用的是多用戶共享連接隊列,并且連接隊列中的數(shù)據(jù)庫連接是與用戶名相關(guān)聯(lián)的,在客戶端與服務端建立數(shù)據(jù)庫連接的過程中,連接池可以記錄客戶端使用的用戶名,并將用戶名與數(shù)據(jù)庫進行關(guān)聯(lián)后存儲到連接隊列中,例如,可以將用戶名作為數(shù)據(jù)庫連接的一個標簽存儲在連接隊列中。其中,連接池可以使用IP地址加TCP/IP端口號來標識客戶端。
[0050]所述預設(shè)門限可以根據(jù)服務端的處理能力來設(shè)置,服務端的處理能力較高時,所述預設(shè)門限可以設(shè)置的較高,服務端的處理能力較低時,所述預設(shè)門限可以設(shè)置的較低。例如,將所述預設(shè)門限設(shè)置為64。
[0051]步驟204,當所述連接隊列的長度大于等于預設(shè)門限時,從所述連接隊列中取出一個數(shù)據(jù)庫連接;
[0052]當所述連接隊列的長度大于等于預設(shè)門限時,說明客戶端可以復用連接隊列中的數(shù)據(jù)庫連接,于是,從所述連接隊列中取出一個數(shù)據(jù)庫連接來供客戶端使用。
[0053]步驟206,判斷客戶端使用的用戶名與取出的數(shù)據(jù)庫連接的用戶名是否相同;
[0054]為避免一個用戶使用另外一個用戶認證過的數(shù)據(jù)庫連接對數(shù)據(jù)庫進行操作所造成的用戶權(quán)限混亂,在本發(fā)明實施例中,在將連接隊列中取出的數(shù)據(jù)庫連接分配給客戶端使用之前,還進一步判斷客戶端使用的用戶名與取出的數(shù)據(jù)庫連接的用戶名是否相同,并根據(jù)判斷結(jié)果進行相應的處理。
[0055]步驟208,當客戶端使用的用戶名與取出的數(shù)據(jù)庫連接的用戶名相同時,將該數(shù)據(jù)庫連接分配給客戶端使用;
[0056]當客戶端使用的用戶名與取出的數(shù)據(jù)庫連接的用戶名相同時,說明該數(shù)據(jù)庫連接之前就是由使用該客戶端的用戶建立的,該用戶具有與該數(shù)據(jù)庫連接對應的權(quán)限,因此,可以直接將該數(shù)據(jù)庫連接分配給客戶端使用。
[0057]步驟210,當客戶端使用的用戶名與取出的數(shù)據(jù)庫連接的用戶名不同時,通知服務端對客戶端進行認證,并在認證通過后將該數(shù)據(jù)庫連接分配給客戶端使用。
[0058]當客戶端使用的用戶名與取出的數(shù)據(jù)庫連接的用戶名不同時,說明該數(shù)據(jù)庫連接之前是由其他用戶建立的,使用該客戶端的用戶不具有與該數(shù)據(jù)接口連接對應的權(quán)限,于是,通知服務端對客戶端進行認證,即將一個用戶認證過的數(shù)據(jù)庫連接轉(zhuǎn)化為另一個用戶認證過的數(shù)據(jù)庫連接,如此,能夠避免用戶權(quán)限混亂。
[0059]可見,根據(jù)本發(fā)明實施例的一個技術(shù)方案,通過將一個用戶認證過的數(shù)據(jù)庫連接轉(zhuǎn)化為另一個用戶認證過的數(shù)據(jù)庫連接,再配合多用戶共享的連接隊列,實現(xiàn)了多用戶權(quán)限隔離的前提下,避免了數(shù)據(jù)庫連接總數(shù)的不斷上升,節(jié)省了連接池耗費的服務器資源。
[0060]可選地,在步驟210中,所述通知服務端對客戶端進行認證的過程為:
[0061]首先,連接池模塊構(gòu)造一個切換用戶命令,所述切換用戶命令中包括客戶端使用的用戶名及密碼信息;
[0062]然后,在將客戶端的數(shù)據(jù)庫操作請求發(fā)送到服務端之前,將所述切換用戶命令發(fā)送到服務端;
[0063]最后,服務端接收到所述切換用戶命令后,根據(jù)所述切換用戶命令中的用戶名和密碼信息對客戶端進行認證,并將認證結(jié)果通知給連接池模塊,所述認證結(jié)果包括認證通過和認證不通過。在認證通過后,連接池模塊將該數(shù)據(jù)庫連接分配給客戶端使用,在認證不通過時,客戶端不能對數(shù)據(jù)庫進行操作。
[0064]其中,當服務端的數(shù)據(jù)庫為MySQL數(shù)據(jù)庫時,所述切換用戶命令可以是MySQL數(shù)據(jù)庫的 COM_CHANGE_USER 命令。
[0065]COM_CHANGE_USER是MySQL的通訊協(xié)議的一種,其目的是將一個用戶(用戶A)的數(shù)據(jù)庫連接改變成另一個用戶(用戶B)的數(shù)據(jù)庫連接,改變的方法是在用戶A的數(shù)據(jù)庫連接上發(fā)送用戶B的用戶名和密碼。也就是說,當連接池模塊發(fā)現(xiàn)客戶端的用戶名與即將分配給該客戶端使用的數(shù)據(jù)庫連接的用戶名不同時,如果直接給其使用,必將導致用戶A訪問到用戶B的數(shù)據(jù),但通過在客戶端的數(shù)據(jù)庫操作請求之前先執(zhí)行一個COM_CHANGE_USER命令,便可以將該數(shù)據(jù)庫連接的用戶進行切換,如客戶端使用的是用戶A,而數(shù)據(jù)庫連接是由用戶B認證的,則可以將該數(shù)據(jù)庫連接切換(CHANGE)到用戶A,然后再在該數(shù)據(jù)庫連接上執(zhí)行用戶A的數(shù)據(jù)庫操作請求,就不會發(fā)生權(quán)限混亂的問題了。
[0066]可選地,所述方法還包括:當所述連接隊列的長度小于預設(shè)門限時,向服務端申請新建一個數(shù)據(jù)庫連接,將新建的數(shù)據(jù)庫連接分配給客戶端使用,并記錄客戶端使用的用戶名信息。
[0067]向服務端申請新建一個數(shù)據(jù)庫連接的過程可以包括:
[0068]首先,連接池模塊將客戶端的數(shù)據(jù)庫連接請求轉(zhuǎn)發(fā)到服務端;
[0069]然后,服務端會發(fā)送一個握手包給連接池模塊,連接池模塊將握手包轉(zhuǎn)發(fā)給客戶端;[0070]其次,客戶端根據(jù)握手包構(gòu)造一個認證包發(fā)送給連接池模塊,連接池模塊將認證包轉(zhuǎn)發(fā)給服務端,認證包中包括用戶名和密碼信息,連接池模塊還在本地記錄客戶端使用的用戶名,這樣,當再次接收到該客戶端的數(shù)據(jù)庫連接請求時,就可以知道該客戶端所使用的用戶名了;
[0071]最后,服務端驗證密碼是否正確后,將認證結(jié)果發(fā)送到連接池模塊,連接池模塊將認證結(jié)果轉(zhuǎn)發(fā)給客戶端,從而完成了 一個數(shù)據(jù)庫連接的建立。
[0072]可選地,所述方法還包括:在客戶端使用完數(shù)據(jù)庫連接(不論是新建的數(shù)據(jù)庫連接,還是從連接隊列中取出數(shù)據(jù)庫連接)后,連接池模塊將該數(shù)據(jù)庫連接及關(guān)聯(lián)的用戶名加入到所述連接隊列中。這樣,客戶端后續(xù)就可以復用該數(shù)據(jù)庫連接了。
[0073]圖3示出了根據(jù)本發(fā)明一個實施例的數(shù)據(jù)庫連接處理方法的詳細流程圖,所述方法用于客戶端與服務端之間,例如,由客戶端與服務端之間的連接池模塊來執(zhí)行該方法。參照圖3,所述方法包括:
[0074]步驟302,接收到客戶端的數(shù)據(jù)庫連接請求;
[0075]步驟304,判斷連接池的連接隊列的長度是否小于預設(shè)門限,若是,進入步驟314,否則,進入步驟306;
[0076]其中,所述連接隊列中存儲有與用戶名相關(guān)聯(lián)的數(shù)據(jù)庫連接。
[0077]步驟306,當所述連接隊列的長度大于等于預設(shè)門限時,從所述連接隊列中取出一個數(shù)據(jù)庫連接;
[0078]步驟308,判斷客戶端使用的用戶名與取出的數(shù)據(jù)庫連接的用戶名是否相同,若是,進入步驟310,否則,進入步驟312 ;
[0079]步驟310,當客戶端使用的用戶名與取出的數(shù)據(jù)庫連接的用戶名相同時,將該數(shù)據(jù)庫連接分配給客戶端使用;
[0080]步驟312,當客戶端使用的用戶名與取出的數(shù)據(jù)庫連接的用戶名不同時,通知服務端對客戶端進行認證,并在認證通過后將該數(shù)據(jù)庫連接分配給客戶端使用;
[0081]步驟314,當所述連接隊列的長度小于預設(shè)門限時,向服務端申請新建一個數(shù)據(jù)庫連接;
[0082]步驟316,將新建的數(shù)據(jù)庫連接分配給客戶端使用,并記錄客戶端使用的用戶名信
肩、O
[0083]步驟318,在客戶端使用完數(shù)據(jù)庫連接后,將該數(shù)據(jù)庫連接及關(guān)聯(lián)的用戶名加入到所述連接隊列中。
[0084]與上述數(shù)據(jù)庫連接處理方法相對應,本發(fā)明實施例還提供一種實現(xiàn)上述方法的數(shù)據(jù)庫連接處理裝置。
[0085]圖4示出了根據(jù)本發(fā)明一個實施例的數(shù)據(jù)庫連接處理裝置結(jié)構(gòu)圖。所述裝置用于客戶端與服務端之間,例如,所述裝置位于客戶端與服務端之間的連接池模塊中,參照圖4,所述裝置包括第一判斷單元10、第一處理單元20、第二判斷單元30和第二處理單元40,其中:
[0086]第一判斷單元10適于接收到客戶端的數(shù)據(jù)庫連接請求時,判斷連接池的連接隊列的長度是否小于預設(shè)門限,其中,所述連接隊列中存儲有與用戶名相關(guān)聯(lián)的數(shù)據(jù)庫連接.[0087]第一處理單元20適于當所述連接隊列的長度大于等于預設(shè)門限時,從所述連接隊列中取出一個數(shù)據(jù)庫連接。
[0088]第二判斷單元30適于判斷客戶端使用的用戶名與取出的數(shù)據(jù)庫連接的用戶名是否相同。
[0089]第二處理單元40適于當客戶端使用的用戶名與取出的數(shù)據(jù)庫連接的用戶名相同時,將該數(shù)據(jù)庫連接分配給客戶端使用;當客戶端使用的用戶名與取出的數(shù)據(jù)庫連接的用戶名不同時,通知服務端對客戶端進行認證,并在認證通過后將該數(shù)據(jù)庫連接分配給客戶端使用。
[0090]其中,第二處理單元40可以安裝如下方式通知服務端對客戶端進行認證:構(gòu)造一個切換用戶命令,所述切換用戶命令中包括客戶端使用的用戶名及密碼信息;在將客戶端的數(shù)據(jù)庫操作請求發(fā)送到服務端之前,將所述切換用戶命令發(fā)送到服務端,以使服務端根據(jù)所述切換用戶命令中的用戶名和密碼信息對客戶端進行認證。當服務端的數(shù)據(jù)庫為MySQL數(shù)據(jù)庫時,所述切換用戶命令可以是MySQL數(shù)據(jù)庫的COM_CHANGE_USER命令。
[0091]可選地,所述裝置還包括第三處理單元(圖未示),所述第三處理單元適于:當所述連接隊列的長度小于預設(shè)門限時,向服務端申請新建一個數(shù)據(jù)庫連接;將新建的數(shù)據(jù)庫連接分配給客戶端使用,并記錄客戶端使用的用戶名信息。
[0092]可選地,所述裝置還包括第四處理單元(圖未示),所述第四處理單元適于在客戶端使用完數(shù)據(jù)庫連接后,將該數(shù)據(jù)庫連接及關(guān)聯(lián)的用戶名加入到所述連接隊列中。
[0093]綜上所述,根據(jù)本發(fā)明提供的上述技術(shù)方案,當客戶端使用的用戶名與從連接池的連接隊列取出的數(shù)據(jù)庫連接的用戶名不同時,通知服務端對客戶端進行認證,在認證通過后再將該數(shù)據(jù)庫連接分配給客戶端使用,這樣,通過將一個用戶認證過的數(shù)據(jù)庫連接轉(zhuǎn)化為另一個用戶認證過的數(shù)據(jù)庫連接,再配合多用戶共享的連接隊列,實現(xiàn)了多用戶權(quán)限隔離的前提下,避免了數(shù)據(jù)庫連接總數(shù)的不斷上升,節(jié)省了連接池耗費的服務器資源。
[0094]在此提供的算法和顯示不與任何特定計算機、虛擬系統(tǒng)或者其它設(shè)備固有相關(guān)。各種通用系統(tǒng)也可以與基于在此的示教一起使用。根據(jù)上面的描述,構(gòu)造這類系統(tǒng)所要求的結(jié)構(gòu)是顯而易見的。此外,本發(fā)明也不針對任何特定編程語言。應當明白,可以利用各種編程語言實現(xiàn)在此描述的本發(fā)明的內(nèi)容,并且上面對特定語言所做的描述是為了披露本發(fā)明的最佳實施方式。
[0095]在此處所提供的說明書中,說明了大量具體細節(jié)。然而,能夠理解,本發(fā)明的實施例可以在沒有這些具體細節(jié)的情況下實踐。在一些實例中,并未詳細示出公知的方法、結(jié)構(gòu)和技術(shù),以便不模糊對本說明書的理解。
[0096]類似地,應當理解,為了精簡本公開并幫助理解各個發(fā)明方面中的一個或多個,在上面對本發(fā)明的示例性實施例的描述中,本發(fā)明的各個特征有時被一起分組到單個實施例、圖、或者對其的描述中。然而,并不應將該公開的方法解釋成反映如下意圖:即所要求保護的本發(fā)明要求比在每個權(quán)利要求中所明確記載的特征更多的特征。更確切地說,如下面的權(quán)利要求書所反映的那樣,發(fā)明方面在于少于前面公開的單個實施例的所有特征。因此,遵循【具體實施方式】的權(quán)利要求書由此明確地并入該【具體實施方式】,其中每個權(quán)利要求本身都作為本發(fā)明的單獨實施例。
[0097]本領(lǐng)域那些技術(shù)人員可以理解,可以對實施例中的設(shè)備中的模塊進行自適應性地改變并且把它們設(shè)置在與該實施例不同的一個或多個設(shè)備中??梢园褜嵤├械哪K或單元或組件組合成一個模塊或單元或組件,以及此外可以把它們分成多個子模塊或子單元或子組件。除了這樣的特征和/或過程或者單元中的至少一些是相互排斥之外,可以采用任何組合對本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的所有特征以及如此公開的任何方法或者設(shè)備的所有過程或單元進行組合。除非另外明確陳述,本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的每個特征可以由提供相同、等同或相似目的的替代特征來代替。
[0098]此外,本領(lǐng)域的技術(shù)人員能夠理解,盡管在此所述的一些實施例包括其它實施例中所包括的某些特征而不是其它特征,但是不同實施例的特征的組合意味著處于本發(fā)明的范圍之內(nèi)并且形成不同的實施例。例如,在下面的權(quán)利要求書中,所要求保護的實施例的任意之一都可以以任意的組合方式來使用。
[0099]本發(fā)明的各個部件實施例可以以硬件實現(xiàn),或者以在一個或者多個處理器上運行的軟件模塊實現(xiàn),或者以它們的組合實現(xiàn)。本領(lǐng)域的技術(shù)人員應當理解,可以在實踐中使用微處理器或者數(shù)字信號處理器(DSP)來實現(xiàn)根據(jù)本發(fā)明實施例的數(shù)據(jù)庫連接處理裝置中的一些或者全部部件的一些或者全部功能。本發(fā)明還可以實現(xiàn)為用于執(zhí)行這里所描述的方法的一部分或者全部的設(shè)備或者裝置程序(例如,計算機程序和計算機程序產(chǎn)品)。這樣的實現(xiàn)本發(fā)明的程序可以存儲在計算機可讀介質(zhì)上,或者可以具有一個或者多個信號的形式。這樣的信號可以從因特網(wǎng)網(wǎng)站上下載得到,或者在載體信號上提供,或者以任何其他形式提供。
[0100]應該注意的是上述實施例對本發(fā)明進行說明而不是對本發(fā)明進行限制,并且本領(lǐng)域技術(shù)人員在不脫離所附權(quán)利要求的范圍的情況下可設(shè)計出替換實施例。在權(quán)利要求中,不應將位于括號之間的任何參考符號構(gòu)造成對權(quán)利要求的限制。單詞“包含”不排除存在未列在權(quán)利要求中的元件或步驟。位于元件之前的單詞“一”或“一個”不排除存在多個這樣的元件。本發(fā)明可以借助于包括有若干不同元件的硬件以及借助于適當編程的計算機來實現(xiàn)。在列舉了若干裝置的單元權(quán)利要求中,這些裝置中的若干個可以是通過同一個硬件項來具體體現(xiàn)。單詞第一、第二、以及第三等的使用不表示任何順序??蓪⑦@些單詞解釋為名稱。
【權(quán)利要求】
1.一種數(shù)據(jù)庫連接處理方法,用于客戶端與服務端之間,所述方法包括: 接收到客戶端的數(shù)據(jù)庫連接請求時,判斷連接池的連接隊列的長度是否小于預設(shè)門限,其中,所述連接隊列中存儲有與用戶名相關(guān)聯(lián)的數(shù)據(jù)庫連接; 當所述連接隊列的長度大于等于預設(shè)門限時,從所述連接隊列中取出一個數(shù)據(jù)庫連接; 判斷客戶端使用的用戶名與取出的數(shù)據(jù)庫連接的用戶名是否相同; 當客戶端使用的用戶名與取出的數(shù)據(jù)庫連接的用戶名相同時,將該數(shù)據(jù)庫連接分配給客戶端使用;當客戶端使用的用戶名與取出的數(shù)據(jù)庫連接的用戶名不同時,通知服務端對客戶端進行認證,并在認證通過后將該數(shù)據(jù)庫連接分配給客戶端使用。
2.如權(quán)利要求1所述的數(shù)據(jù)庫連接處理方法,其中,還包括: 當所述連接隊列的長度小于預設(shè)門限時,向服務端申請新建一個數(shù)據(jù)庫連接; 將新建的數(shù)據(jù)庫連接分配給客戶端使用,并記錄客戶端使用的用戶名信息。
3.如權(quán)利要求1或2所述的數(shù)據(jù)庫連接處理方法,其中,還包括: 在客戶端使用完數(shù)據(jù)庫連接后,將該數(shù)據(jù)庫連接及關(guān)聯(lián)的用戶名加入到所述連接隊列中。
4.如權(quán)利要求1所述的數(shù)據(jù)庫連接處理方法,其中,所述通知服務端對客戶端進行認證,包括: 構(gòu)造一個切換用戶命令,所述切換用戶命令中包括客戶端使用的用戶名及密碼信息;在將客戶端的數(shù)據(jù)庫操作請求發(fā)送到服務端之前,將所述切換用戶命令發(fā)送到服務端,以使服務端根據(jù)所述切換用戶命令中的用戶名和密碼信息對客戶端進行認證。
5.如權(quán)利要求4所述的數(shù)據(jù)庫連接處理方法,其中,所述切換用戶命令為MySQL數(shù)據(jù)庫的 COM_CHANGE_USER 命令。
6.一種數(shù)據(jù)庫連接處理裝置,用于客戶端與服務端之間,所述裝置包括: 第一判斷單元,適于接收到客戶端的數(shù)據(jù)庫連接請求時,判斷連接池的連接隊列的長度是否小于預設(shè)門限,其中,所述連接隊列中存儲有與用戶名相關(guān)聯(lián)的數(shù)據(jù)庫連接; 第一處理單元,適于當所述連接隊列的長度大于等于預設(shè)門限時,從所述連接隊列中取出一個數(shù)據(jù)庫連接; 第二判斷單元,適于判斷客戶端使用的用戶名與取出的數(shù)據(jù)庫連接的用戶名是否相同; 第二處理單元,適于當客戶端使用的用戶名與取出的數(shù)據(jù)庫連接的用戶名相同時,將該數(shù)據(jù)庫連接分配給客戶端使用;當客戶端使用的用戶名與取出的數(shù)據(jù)庫連接的用戶名不同時,通知服務端對客戶端進行認證,并在認證通過后將該數(shù)據(jù)庫連接分配給客戶端使用。
7.如權(quán)利要求6所述的數(shù)據(jù)庫連接處理裝置,其中,還包括第三處理單元,所述第三處理單元適于: 當所述連接隊列的長度小于預設(shè)門限時,向服務端申請新建一個數(shù)據(jù)庫連接; 將新建的數(shù)據(jù)庫連接分配給客戶端使用,并記錄客戶端使用的用戶名信息。
8.如權(quán)利要求6或7所述的數(shù)據(jù)庫連接處理裝置,其中,還包括第四處理單元,所述第四處理單元適于在客戶端使用完數(shù)據(jù)庫連接后,將該數(shù)據(jù)庫連接及關(guān)聯(lián)的用戶名加入到所述連接隊列中。
9.如權(quán)利要求6所述的數(shù)據(jù)庫連接處理裝置,其中,所述第二處理單元進一步適于: 構(gòu)造一個切換用戶命令,所述切換用戶命令中包括客戶端使用的用戶名及密碼信息; 在將客戶端的數(shù)據(jù)庫操作請求發(fā)送到服務端之前,將所述切換用戶命令發(fā)送到服務端,以使服務端根據(jù)所述切換用戶命令中的用戶名和密碼信息對客戶端進行認證。
10.如權(quán)利要求9所述的數(shù)據(jù)庫連接處理裝置,其中,所述切換用戶命令為MySQL數(shù)據(jù)庫的 COM_CHANGE_USER 命令 。
【文檔編號】H04L29/06GK103634298SQ201310563628
【公開日】2014年3月12日 申請日期:2013年11月14日 優(yōu)先權(quán)日:2013年11月14日
【發(fā)明者】朱超, 陳飛, 王超 申請人:北京奇虎科技有限公司, 奇智軟件(北京)有限公司