本發(fā)明屬于數(shù)據(jù)庫(kù)應(yīng)用技術(shù)領(lǐng)域,尤其涉及一種基于讀寫分離的數(shù)據(jù)庫(kù)操作方法及裝置。
背景技術(shù):
在數(shù)據(jù)庫(kù)應(yīng)用場(chǎng)景中,應(yīng)用系統(tǒng)(如web應(yīng)用系統(tǒng)等)的訪問(wèn)量/請(qǐng)求數(shù)不斷增大,為應(yīng)對(duì)不斷增大的訪問(wèn)量/請(qǐng)求數(shù),提升系統(tǒng)的最大并發(fā)數(shù)以及降低系統(tǒng)的單次請(qǐng)求響應(yīng)時(shí)間的需求日益凸顯。
應(yīng)用系統(tǒng)通過(guò)操作(讀和/或?qū)?其后臺(tái)的數(shù)據(jù)庫(kù),來(lái)為用戶請(qǐng)求提供所需的數(shù)據(jù)支持,基于此,應(yīng)用系統(tǒng)的最大并發(fā)數(shù)以及單次請(qǐng)求響應(yīng)時(shí)間與數(shù)據(jù)庫(kù)操作性能具有密不可分的關(guān)系,數(shù)據(jù)庫(kù)已成為限制系統(tǒng)提升最大并發(fā)數(shù)及降低單次請(qǐng)求響應(yīng)時(shí)間的瓶頸。
技術(shù)實(shí)現(xiàn)要素:
有鑒于此,本發(fā)明的目的在于提供一種基于讀寫分離的數(shù)據(jù)庫(kù)操作方法及裝置,旨在解決現(xiàn)有技術(shù)存在的上述問(wèn)題,為提升應(yīng)用系統(tǒng)的最大并發(fā)數(shù)及降低應(yīng)用系統(tǒng)的單次請(qǐng)求響應(yīng)時(shí)間提供支持。
為此,本發(fā)明公開如下技術(shù)方案:
一種基于讀寫分離的數(shù)據(jù)庫(kù)操作方法,包括:
獲得前端系統(tǒng)對(duì)后臺(tái)的目標(biāo)數(shù)據(jù)庫(kù)的操作請(qǐng)求;
確定所述操作請(qǐng)求的請(qǐng)求類型,所述請(qǐng)求類型為讀請(qǐng)求或?qū)懻?qǐng)求中的任意一種;
若所述操作請(qǐng)求的請(qǐng)求類型為寫請(qǐng)求,則將所述操作請(qǐng)求分配至所述目標(biāo)數(shù)據(jù)庫(kù)的主數(shù)據(jù)庫(kù)進(jìn)行處理,以實(shí)現(xiàn)對(duì)所述主數(shù)據(jù)庫(kù)進(jìn)行寫操作;
若所述操作請(qǐng)求的請(qǐng)求類型為讀請(qǐng)求,則將所述操作請(qǐng)求分配至所述目標(biāo)數(shù)據(jù)庫(kù)的從數(shù)據(jù)庫(kù)進(jìn)行處理,以實(shí)現(xiàn)對(duì)從數(shù)據(jù)庫(kù)進(jìn)行讀操作;其中,所述目標(biāo)數(shù)據(jù)庫(kù)對(duì)應(yīng)至少一個(gè)主數(shù)據(jù)庫(kù)及至少一個(gè)從數(shù)據(jù)庫(kù),當(dāng)所述主數(shù)據(jù)庫(kù)的數(shù)據(jù)更新時(shí),基于數(shù)據(jù)庫(kù)復(fù)制技術(shù)對(duì)所述從數(shù)據(jù)庫(kù)進(jìn)行同步的數(shù)據(jù)更新,以使得所述從數(shù)據(jù)庫(kù)的數(shù)據(jù)與所述主數(shù)據(jù)庫(kù)的數(shù)據(jù)保持一致。
上述方法,優(yōu)選的,所述確定所述操作請(qǐng)求的請(qǐng)求類型,包括:
解析所述操作請(qǐng)求;
基于解析結(jié)果,確定所述操作請(qǐng)求的請(qǐng)求類型。
上述方法,優(yōu)選的,所述若所述操作請(qǐng)求的請(qǐng)求類型為寫請(qǐng)求,則所述將所述操作請(qǐng)求分配至所述目標(biāo)數(shù)據(jù)庫(kù)的主數(shù)據(jù)庫(kù)進(jìn)行處理,包括:
從預(yù)先創(chuàng)建的兩個(gè)連接池中確定出與寫請(qǐng)求類型相對(duì)應(yīng)的第一連接池,所述第一連接池中包括已創(chuàng)建的能夠連接至所述目標(biāo)數(shù)據(jù)庫(kù)的主數(shù)據(jù)庫(kù)的多個(gè)連接;
從所述第一連接池中選擇出一空閑的第一連接;
利用所述空閑的第一連接,將所述操作請(qǐng)求路由至所述主數(shù)據(jù)庫(kù)。
上述方法,優(yōu)選的,所述若所述操作請(qǐng)求的請(qǐng)求類型為讀請(qǐng)求,則將所述操作請(qǐng)求分配至所述目標(biāo)數(shù)據(jù)庫(kù)的從數(shù)據(jù)庫(kù)進(jìn)行處理,包括:
從預(yù)先創(chuàng)建的兩個(gè)連接池中確定出與讀請(qǐng)求類型相對(duì)應(yīng)的第二連接池,所述第二連接池中包括已創(chuàng)建的能夠連接至所述目標(biāo)數(shù)據(jù)庫(kù)的從數(shù)據(jù)庫(kù)的多個(gè)連接;
從所述第二連接池中選擇出一空閑的第二連接;
利用所述空閑的第二連接,將所述操作請(qǐng)求路由至所述從數(shù)據(jù)庫(kù)。
上述方法,優(yōu)選的,還包括:
當(dāng)所述第一連接池和/或所述第二連接池中的任意一連接的空閑時(shí)長(zhǎng)達(dá)到預(yù)定閾值時(shí),釋放空閑時(shí)長(zhǎng)達(dá)到所述預(yù)定閾值的所述連接。
一種基于讀寫分離的數(shù)據(jù)庫(kù)操作裝置,包括:
獲取單元,用于獲得前端系統(tǒng)對(duì)后臺(tái)的目標(biāo)數(shù)據(jù)庫(kù)的操作請(qǐng)求;
確定單元,用于確定所述操作請(qǐng)求的請(qǐng)求類型,所述請(qǐng)求類型為讀請(qǐng)求或?qū)懻?qǐng)求中的任意一種;
第一操作處理單元,用于在所述操作請(qǐng)求的請(qǐng)求類型為寫請(qǐng)求時(shí),將所述操作請(qǐng)求分配至所述目標(biāo)數(shù)據(jù)庫(kù)的主數(shù)據(jù)庫(kù)進(jìn)行處理,以實(shí)現(xiàn)對(duì)所述主數(shù)據(jù)庫(kù)進(jìn)行寫操作;
第二操作處理單元,用于在所述操作請(qǐng)求的請(qǐng)求類型為讀請(qǐng)求時(shí),將所述操作請(qǐng)求分配至所述目標(biāo)數(shù)據(jù)庫(kù)的從數(shù)據(jù)庫(kù)進(jìn)行處理,以實(shí)現(xiàn)對(duì)從數(shù)據(jù)庫(kù)進(jìn)行讀操作;其中,所述目標(biāo)數(shù)據(jù)庫(kù)對(duì)應(yīng)至少一個(gè)主數(shù)據(jù)庫(kù)及至少一個(gè)從數(shù)據(jù)庫(kù),當(dāng)所述主數(shù)據(jù)庫(kù)的數(shù)據(jù)更新時(shí),基于數(shù)據(jù)庫(kù)復(fù)制技術(shù)對(duì)所述從數(shù)據(jù)庫(kù)進(jìn)行同步的數(shù)據(jù)更新,以使得所述從數(shù)據(jù)庫(kù)的數(shù)據(jù)與所述主數(shù)據(jù)庫(kù)的數(shù)據(jù)保持一致。
上述裝置,優(yōu)選的,所述確定單元,進(jìn)一步用于:
解析所述操作請(qǐng)求;基于解析結(jié)果,確定所述操作請(qǐng)求的請(qǐng)求類型。
上述裝置,優(yōu)選的,所述第一操作處理單元,進(jìn)一步用于:
從預(yù)先創(chuàng)建的兩個(gè)連接池中確定出與寫請(qǐng)求類型相對(duì)應(yīng)的第一連接池,所述第一連接池中包括已創(chuàng)建的能夠連接至所述目標(biāo)數(shù)據(jù)庫(kù)的主數(shù)據(jù)庫(kù)的多個(gè)連接;從所述第一連接池中選擇出一空閑的第一連接;利用所述空閑的第一連接,將所述操作請(qǐng)求路由至所述主數(shù)據(jù)庫(kù)。
上述裝置,優(yōu)選的,所述第二操作處理單元,進(jìn)一步用于:
從預(yù)先創(chuàng)建的兩個(gè)連接池中確定出與讀請(qǐng)求類型相對(duì)應(yīng)的第二連接池,所述第二連接池中包括已創(chuàng)建的能夠連接至所述目標(biāo)數(shù)據(jù)庫(kù)的從數(shù)據(jù)庫(kù)的多個(gè)連接;從所述第二連接池中選擇出一空閑的第二連接;利用所述空閑的第二連接,將所述操作請(qǐng)求路由至所述從數(shù)據(jù)庫(kù)。
上述裝置,優(yōu)選的,還包括:
釋放單元,用于在所述第一連接池和/或所述第二連接池中的任意一連接的空閑時(shí)長(zhǎng)達(dá)到預(yù)定閾值時(shí),釋放空閑時(shí)長(zhǎng)達(dá)到所述預(yù)定閾值的所述連接。
由以上方案可知,本發(fā)明公開的基于讀寫分離的數(shù)據(jù)庫(kù)操作方法,通過(guò)將后臺(tái)的數(shù)據(jù)庫(kù)劃分為主、從兩種類型的數(shù)據(jù)庫(kù),并約定在主數(shù)據(jù)庫(kù)處理寫請(qǐng)求,在從數(shù)據(jù)庫(kù)處理讀請(qǐng)求,其中,從數(shù)據(jù)庫(kù)依賴于主數(shù)據(jù)庫(kù),基于數(shù)據(jù)庫(kù)復(fù)制技術(shù)與主數(shù)據(jù)庫(kù)的數(shù)據(jù)保持一致。在此基礎(chǔ)上,當(dāng)前端系統(tǒng)存在對(duì)后臺(tái)的數(shù)據(jù)庫(kù)的操作請(qǐng)求時(shí),依據(jù)該請(qǐng)求所屬的寫請(qǐng)求類型或讀請(qǐng)求類型,相應(yīng)地將其分配至主數(shù)據(jù)庫(kù)或從數(shù)據(jù)庫(kù)處理??梢?,本發(fā)明方案通過(guò)分別在主、從數(shù)據(jù)庫(kù)中的不同數(shù)據(jù)庫(kù)進(jìn)行相應(yīng)的一種操作(讀或?qū)?,實(shí)現(xiàn)了對(duì)數(shù)據(jù)庫(kù)的讀、寫分離,與現(xiàn)有技術(shù)在同一數(shù)據(jù)庫(kù)揉雜式地處理所有讀寫請(qǐng)求相比,本發(fā)明降低了同一數(shù)據(jù)庫(kù)處理所有讀寫請(qǐng)求的處理壓力,可明顯提高對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作時(shí)的操作性能,從而為提升應(yīng)用系統(tǒng)的最大并發(fā)數(shù)及降低應(yīng)用系統(tǒng)的單次請(qǐng)求響應(yīng)時(shí)間提供了支持。
附圖說(shuō)明
為了更清楚地說(shuō)明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)提供的附圖獲得其他的附圖。
圖1是本發(fā)明實(shí)施例一提供的基于讀寫分離的數(shù)據(jù)庫(kù)操作方法流程圖;
圖2是本發(fā)明實(shí)施例二提供的基于讀寫分離的數(shù)據(jù)庫(kù)操作方法流程圖;
圖3是本發(fā)明實(shí)施例三提供的基于讀寫分離的數(shù)據(jù)庫(kù)操作方法流程圖;
圖4是本發(fā)明實(shí)施例四提供的基于讀寫分離的數(shù)據(jù)庫(kù)操作裝置的結(jié)構(gòu)示意圖。
具體實(shí)施方式
為了引用和清楚起見,下文中使用的技術(shù)名詞、簡(jiǎn)寫或縮寫總結(jié)解釋如下:
數(shù)據(jù)庫(kù)連接池:負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫(kù)連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫(kù)連接,而不是再重新建立一個(gè)。
下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例。基于本發(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
實(shí)施例一
本發(fā)明實(shí)施例一公開一種基于讀寫分離的數(shù)據(jù)庫(kù)操作方法,可應(yīng)用于數(shù)據(jù)庫(kù)應(yīng)用場(chǎng)景中,旨在提升前端系統(tǒng),如前端的web應(yīng)用系統(tǒng)等操作后臺(tái)數(shù)據(jù)庫(kù)時(shí)的操作性能。
本發(fā)明的主要思想是:通過(guò)將后臺(tái)的數(shù)據(jù)庫(kù)劃分為主、從兩種類型的數(shù)據(jù)庫(kù),并約定在主數(shù)據(jù)庫(kù)處理寫請(qǐng)求,在從數(shù)據(jù)庫(kù)處理讀請(qǐng)求,其中,從數(shù)據(jù)庫(kù)依賴于主數(shù)據(jù)庫(kù),當(dāng)主數(shù)據(jù)庫(kù)的數(shù)據(jù)更新時(shí),從數(shù)據(jù)庫(kù)基于數(shù)據(jù)庫(kù)復(fù)制技術(shù)與主數(shù)據(jù)庫(kù)的數(shù)據(jù)保持一致。在此基礎(chǔ)上,當(dāng)前端系統(tǒng)存在對(duì)后臺(tái)的數(shù)據(jù)庫(kù)的操作請(qǐng)求時(shí),依據(jù)該請(qǐng)求所屬的寫請(qǐng)求類型或讀請(qǐng)求類型,相應(yīng)地將其分配至主數(shù)據(jù)庫(kù)或從數(shù)據(jù)庫(kù)處理。以此降低現(xiàn)有技術(shù)在同一數(shù)據(jù)庫(kù)處理所有讀寫請(qǐng)求時(shí)的處理壓力,進(jìn)而提升操作數(shù)據(jù)庫(kù)時(shí)的操作性能。
參考圖1示出的基于讀寫分離的數(shù)據(jù)庫(kù)操作方法流程圖,所述方法可以包括以下步驟:
步驟101、獲得前端系統(tǒng)對(duì)后臺(tái)的目標(biāo)數(shù)據(jù)庫(kù)的操作請(qǐng)求。
其中,所述前端系統(tǒng)可以是數(shù)據(jù)庫(kù)應(yīng)用場(chǎng)景中處于數(shù)據(jù)庫(kù)前端的各種應(yīng)用系統(tǒng),如具體可以是web應(yīng)用系統(tǒng)等。
所述操作請(qǐng)求可以是用戶在操作所述前端系統(tǒng)時(shí),前端系統(tǒng)基于用戶操作所產(chǎn)生并發(fā)出的用于操作后臺(tái)目標(biāo)數(shù)據(jù)庫(kù)的請(qǐng)求,以實(shí)現(xiàn)為響應(yīng)用戶操作提供支持,如前端系統(tǒng)通過(guò)查詢后臺(tái)數(shù)據(jù)庫(kù)來(lái)響應(yīng)用戶的獲取相關(guān)數(shù)據(jù)的操作等。
本步驟101可采用攔截方式獲得前端系統(tǒng)對(duì)后臺(tái)的目標(biāo)數(shù)據(jù)庫(kù)的操作請(qǐng)求,即當(dāng)前端系統(tǒng)基于用戶操作生成并發(fā)出對(duì)后臺(tái)目標(biāo)數(shù)據(jù)庫(kù)的操作請(qǐng)求時(shí),本步驟攔截該操作請(qǐng)求,并繼續(xù)依據(jù)接下來(lái)的各步驟對(duì)其進(jìn)行后續(xù)處理。其中,所攔截的請(qǐng)求具體可以是SQL形式的操作請(qǐng)求。
步驟102、確定所述操作請(qǐng)求的請(qǐng)求類型,所述請(qǐng)求類型為讀請(qǐng)求或?qū)懻?qǐng)求中的任意一種。
本發(fā)明旨在實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作時(shí)的讀、寫分離,基于此,在獲得前端系統(tǒng)對(duì)后臺(tái)的目標(biāo)數(shù)據(jù)庫(kù)的操作請(qǐng)求后,需確定該操作請(qǐng)求的請(qǐng)求類型具體為讀類型還是寫類型,以方便按其所屬的讀/寫類型對(duì)其進(jìn)行相應(yīng)處理。
本步驟可通過(guò)解析所述操作請(qǐng)求,并在解析的基礎(chǔ)上,依據(jù)解析結(jié)果來(lái)確定所述操作請(qǐng)求的請(qǐng)求類型。其中,對(duì)于SQL形式的操作請(qǐng)求而言,具體可采用一SQL解析器對(duì)攔截的SQL操作請(qǐng)求進(jìn)行解析,通過(guò)SQL解析來(lái)獲知該操作請(qǐng)求的讀或?qū)戭愋汀?/p>
步驟103、若所述操作請(qǐng)求的請(qǐng)求類型為寫請(qǐng)求,則將所述操作請(qǐng)求分配至所述目標(biāo)數(shù)據(jù)庫(kù)的主數(shù)據(jù)庫(kù)進(jìn)行處理,以實(shí)現(xiàn)對(duì)所述主數(shù)據(jù)庫(kù)進(jìn)行寫操作。
本發(fā)明預(yù)先將后臺(tái)的數(shù)據(jù)庫(kù)劃分為具有主、從關(guān)系的一套數(shù)據(jù)庫(kù),其中,設(shè)定主數(shù)據(jù)庫(kù)專門用于負(fù)責(zé)寫操作類型(簡(jiǎn)稱寫類型)的SQL請(qǐng)求處理,從數(shù)據(jù)庫(kù)專門用于負(fù)責(zé)讀操作類型(簡(jiǎn)稱寫類型)的SQL請(qǐng)求處理,從數(shù)據(jù)庫(kù)依賴于主數(shù)據(jù)庫(kù),當(dāng)主數(shù)據(jù)因處理寫操作類型的SQL請(qǐng)求而發(fā)生數(shù)據(jù)變動(dòng)(增/刪/改數(shù)據(jù))時(shí),從數(shù)據(jù)庫(kù)基于數(shù)據(jù)庫(kù)復(fù)制技術(shù)與主數(shù)據(jù)庫(kù)的數(shù)據(jù)保持一致。主、從數(shù)據(jù)庫(kù)均可以根據(jù)實(shí)際需求,如根據(jù)前端系統(tǒng)的訪問(wèn)量、所需的最大并發(fā)數(shù)等設(shè)置為相應(yīng)的一個(gè)或多個(gè)。
通常情況下系統(tǒng)請(qǐng)求中讀操作的數(shù)量遠(yuǎn)遠(yuǎn)大于寫操作的數(shù)量,基于此,實(shí)際應(yīng)用場(chǎng)景中,可將主數(shù)據(jù)庫(kù)的數(shù)量設(shè)定為一個(gè),而從數(shù)據(jù)庫(kù)的數(shù)量設(shè)置為1-2個(gè),當(dāng)主數(shù)據(jù)庫(kù)的數(shù)量設(shè)定為一個(gè)時(shí),所述主數(shù)據(jù)庫(kù)即可以為待劃分的原數(shù)據(jù)庫(kù)本身,所述相應(yīng)數(shù)量的從數(shù)據(jù)庫(kù)在初始時(shí)則為依據(jù)數(shù)據(jù)庫(kù)復(fù)制技術(shù)所復(fù)制的與主數(shù)據(jù)庫(kù)具有相同內(nèi)容的數(shù)據(jù)庫(kù),后續(xù),由于從數(shù)據(jù)庫(kù)專門負(fù)責(zé)處理讀操作類型的SQL請(qǐng)求,從而從數(shù)據(jù)庫(kù)本身不會(huì)因處理SQL請(qǐng)求而使得其數(shù)據(jù)發(fā)生變動(dòng),僅當(dāng)主數(shù)據(jù)庫(kù)因處理寫請(qǐng)求而發(fā)生數(shù)據(jù)變動(dòng)時(shí),才依據(jù)數(shù)據(jù)庫(kù)復(fù)制技術(shù)同步修改從數(shù)據(jù)庫(kù)的數(shù)據(jù),使其與主數(shù)據(jù)庫(kù)內(nèi)容保持一致。
基于此,當(dāng)解析并確定出所攔截的操作請(qǐng)求的類型后,可進(jìn)一步依據(jù)該操作請(qǐng)求所屬的讀或?qū)戭愋?,確定需將其分配至主數(shù)據(jù)庫(kù)還是從數(shù)據(jù)庫(kù)。其中,如果所述操作請(qǐng)求的請(qǐng)求類型為寫請(qǐng)求,則將其分配至目標(biāo)數(shù)據(jù)庫(kù)的主數(shù)據(jù)庫(kù)進(jìn)行處理。具體地,可通過(guò)建立與主數(shù)據(jù)庫(kù)間的連接,來(lái)利用該連接將所述操作請(qǐng)求路由至目標(biāo)數(shù)據(jù)庫(kù)的主數(shù)據(jù)庫(kù),從而最終可實(shí)現(xiàn)對(duì)主數(shù)據(jù)庫(kù)進(jìn)行寫操作。
步驟104、若所述操作請(qǐng)求的請(qǐng)求類型為讀請(qǐng)求,則將所述操作請(qǐng)求分配至所述目標(biāo)數(shù)據(jù)庫(kù)的從數(shù)據(jù)庫(kù)進(jìn)行處理,以實(shí)現(xiàn)對(duì)從數(shù)據(jù)庫(kù)進(jìn)行讀操作;其中,所述目標(biāo)數(shù)據(jù)庫(kù)對(duì)應(yīng)至少一個(gè)主數(shù)據(jù)庫(kù)及至少一個(gè)從數(shù)據(jù)庫(kù),當(dāng)所述主數(shù)據(jù)庫(kù)的數(shù)據(jù)更新時(shí),基于數(shù)據(jù)庫(kù)復(fù)制技術(shù)對(duì)所述從數(shù)據(jù)庫(kù)進(jìn)行同步的數(shù)據(jù)更新,以使得所述從數(shù)據(jù)庫(kù)的數(shù)據(jù)與所述主數(shù)據(jù)庫(kù)的數(shù)據(jù)保持一致。
反之,如果所述操作請(qǐng)求的請(qǐng)求類型為讀請(qǐng)求,則將其分配至目標(biāo)數(shù)據(jù)庫(kù)的從數(shù)據(jù)庫(kù)進(jìn)行處理。具體地,可通過(guò)建立與從數(shù)據(jù)庫(kù)間的連接,來(lái)利用該連接將所述操作請(qǐng)求路由至目標(biāo)數(shù)據(jù)庫(kù)的從數(shù)據(jù)庫(kù),最終可實(shí)現(xiàn)對(duì)從數(shù)據(jù)庫(kù)進(jìn)行讀操作。
需要說(shuō)明的是,應(yīng)用本申請(qǐng)方法對(duì)前端系統(tǒng)的操作請(qǐng)求所進(jìn)行的讀、寫分離處理過(guò)程,于前端系統(tǒng)而言是屏蔽的,即對(duì)于前端系統(tǒng)而言,當(dāng)其存在對(duì)后臺(tái)目標(biāo)數(shù)據(jù)庫(kù)的讀/寫操作需求時(shí),僅需依據(jù)實(shí)際需求,生成并發(fā)出針對(duì)目標(biāo)數(shù)據(jù)庫(kù)(例如數(shù)據(jù)庫(kù)A)的讀/寫操作請(qǐng)求即可,而不必對(duì)讀、寫類型的操作請(qǐng)求作任何分離處理,后端處理部分在接收到該請(qǐng)求后,才依據(jù)解析、識(shí)別出的該請(qǐng)求的寫或讀類型,相應(yīng)地,將其路由至目標(biāo)數(shù)據(jù)庫(kù)的主數(shù)據(jù)庫(kù)或從數(shù)據(jù)庫(kù)進(jìn)行處理,如假設(shè)前端系統(tǒng)發(fā)出對(duì)數(shù)據(jù)庫(kù)A的寫操作請(qǐng)求,則最終可將該請(qǐng)求路由至數(shù)據(jù)庫(kù)A的主數(shù)據(jù)庫(kù)(可以為數(shù)據(jù)庫(kù)A本身)處理,反之,如果前端系統(tǒng)發(fā)出對(duì)數(shù)據(jù)庫(kù)A的讀操作請(qǐng)求,則相應(yīng)地將其路由至數(shù)據(jù)庫(kù)A的從數(shù)據(jù)庫(kù),如數(shù)據(jù)庫(kù)B進(jìn)行處理,以此實(shí)現(xiàn)了對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作時(shí)的讀、寫操作分離,相對(duì)于在同一數(shù)據(jù)庫(kù)進(jìn)行所有讀/寫操作而言,可大大降低數(shù)據(jù)庫(kù)的處理壓力,提升操作數(shù)據(jù)庫(kù)時(shí)的操作性能。
由以上方案可知,本發(fā)明公開的基于讀寫分離的數(shù)據(jù)庫(kù)操作方法,通過(guò)分別在主、從數(shù)據(jù)庫(kù)中的不同數(shù)據(jù)庫(kù)進(jìn)行相應(yīng)的一種操作(讀或?qū)?,實(shí)現(xiàn)了對(duì)數(shù)據(jù)庫(kù)的讀、寫分離,與現(xiàn)有技術(shù)在同一數(shù)據(jù)庫(kù)揉雜式地處理所有讀寫請(qǐng)求相比,本發(fā)明降低了同一數(shù)據(jù)庫(kù)處理所有讀寫請(qǐng)求的處理壓力,可明顯提高對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作時(shí)的操作性能,從而為提升應(yīng)用系統(tǒng)的最大并發(fā)數(shù)及降低應(yīng)用系統(tǒng)的單次請(qǐng)求響應(yīng)時(shí)間提供了支持。
實(shí)施例二
本實(shí)施例二具體提供所述步驟103及步驟104的一種較優(yōu)的實(shí)現(xiàn)方式,參考圖2示出的基于讀寫分離的數(shù)據(jù)庫(kù)操作方法流程圖,本實(shí)施例中,所述步驟103具體可以通過(guò)以下步驟實(shí)現(xiàn):
步驟1031、若所述操作請(qǐng)求的請(qǐng)求類型為寫請(qǐng)求,從預(yù)先創(chuàng)建的兩個(gè)連接池中確定出與寫請(qǐng)求類型相對(duì)應(yīng)的第一連接池,所述第一連接池中包括已創(chuàng)建的能夠連接至所述目標(biāo)數(shù)據(jù)庫(kù)的主數(shù)據(jù)庫(kù)的多個(gè)連接;
步驟1032、從所述第一連接池中選擇出一空閑的第一連接;
步驟1033、利用所述空閑的第一連接,將所述操作請(qǐng)求路由至所述主數(shù)據(jù)庫(kù)。
本實(shí)施例通過(guò)預(yù)先創(chuàng)建連接池,并利用連接池中已建立的數(shù)據(jù)庫(kù)連接,實(shí)現(xiàn)將所解析、識(shí)別的操作請(qǐng)求路由至相應(yīng)的主數(shù)據(jù)庫(kù)或從數(shù)據(jù)庫(kù)。
具體地,在數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)啟動(dòng)進(jìn)行初始化時(shí)創(chuàng)建兩個(gè)連接池:第一連接池、第二連接池,其中,第一連接池,負(fù)責(zé)寫類型的操作請(qǐng)求的路由處理,第二連接池負(fù)責(zé)讀類型的操作請(qǐng)求的路由處理。兩個(gè)連接池中均包含多個(gè)連接,系統(tǒng)啟動(dòng)并初始化完成后,兩個(gè)連接池的各個(gè)連接均建立生效,從而完成與相應(yīng)數(shù)據(jù)庫(kù)間的連接。
在此基礎(chǔ)上,當(dāng)解析并確定出前端系統(tǒng)的操作請(qǐng)求所屬的類型后,可基于該操作請(qǐng)求的請(qǐng)求類型確定需將其路由至哪個(gè)數(shù)據(jù)庫(kù),如具體需將其路由至主數(shù)據(jù)庫(kù)還是從數(shù)據(jù)庫(kù),并進(jìn)一步確定出需基于哪個(gè)連接池中的連接將其路由至所需的數(shù)據(jù)庫(kù)。
其中,如果所述操作請(qǐng)求的請(qǐng)求類型為寫請(qǐng)求,則具體從負(fù)責(zé)對(duì)寫請(qǐng)求進(jìn)行路由處理的第一連接池中選擇出一空閑的第一連接,并利用該第一連接將所述寫類型的操作請(qǐng)求路由至主數(shù)據(jù)庫(kù),以完成對(duì)主數(shù)據(jù)庫(kù)進(jìn)行寫操作。
相應(yīng)地,所述步驟104可以通過(guò)以下步驟實(shí)現(xiàn):
步驟1041、若所述操作請(qǐng)求的請(qǐng)求類型為讀請(qǐng)求,從預(yù)先創(chuàng)建的兩個(gè)連接池中確定出與讀請(qǐng)求類型相對(duì)應(yīng)的第二連接池,所述第二連接池中包括已創(chuàng)建的能夠連接至所述目標(biāo)數(shù)據(jù)庫(kù)的從數(shù)據(jù)庫(kù)的多個(gè)連接;
步驟1042、從所述第二連接池中選擇出一空閑的第二連接;
步驟1043、利用所述空閑的第二連接,將所述操作請(qǐng)求路由至所述從數(shù)據(jù)庫(kù)。
具體地,如果所述操作請(qǐng)求的請(qǐng)求類型為讀請(qǐng)求,則需從負(fù)責(zé)對(duì)讀請(qǐng)求進(jìn)行路由處理的第二連接池中選擇出一空閑的第二連接,并利用該第二連接將所述讀類型的操作請(qǐng)求路由至從數(shù)據(jù)庫(kù),以完成對(duì)從數(shù)據(jù)庫(kù)進(jìn)行讀操作。
采用本發(fā)明實(shí)施例的方案,當(dāng)需要將相應(yīng)的寫/讀操作請(qǐng)求分配至相應(yīng)的主/從數(shù)據(jù)庫(kù)進(jìn)行處理時(shí),可利用預(yù)先創(chuàng)建的用于負(fù)責(zé)對(duì)寫/讀操作請(qǐng)求進(jìn)行路由處理的第一/第二連接池中的已有空閑連接直接將所述寫/讀操作請(qǐng)求路由至所需的主/從數(shù)據(jù)庫(kù),而不必臨時(shí)新建連接,實(shí)現(xiàn)了對(duì)已有數(shù)據(jù)庫(kù)連接的重復(fù)使用,可有效提升對(duì)操作請(qǐng)求進(jìn)行路由時(shí)的路由效率,進(jìn)一步改善了操作數(shù)據(jù)庫(kù)的操作性能。
實(shí)施例三
本發(fā)明實(shí)施例三中,參考圖3示出的基于讀寫分離的數(shù)據(jù)庫(kù)操作方法流程圖,該方法還可以包括以下步驟:
步驟105:當(dāng)所述第一連接池和/或所述第二連接池中的任意一連接的空閑時(shí)長(zhǎng)達(dá)到預(yù)定閾值時(shí),釋放空閑時(shí)長(zhǎng)達(dá)到所述預(yù)定閾值的所述連接。
考慮到數(shù)據(jù)庫(kù)一般都會(huì)存在一個(gè)并發(fā)連接數(shù)上限,基于此,本實(shí)施例中,設(shè)定一個(gè)最大空閑時(shí)長(zhǎng),其中,該步驟105中所述預(yù)定閾值既可以是所述最大空閑時(shí)長(zhǎng)對(duì)應(yīng)的時(shí)長(zhǎng)值,當(dāng)?shù)谝贿B接池和/或第二連接池中的任意一個(gè)連接的空閑時(shí)長(zhǎng)達(dá)到所述最大空閑時(shí)長(zhǎng)時(shí),則在相應(yīng)的第一連接池或第二連接池中釋放該連接,以避免空閑時(shí)間太長(zhǎng)的閑置連接繼續(xù)占用數(shù)據(jù)庫(kù)資源,進(jìn)而避免資源浪費(fèi),同時(shí),及時(shí)釋放空閑時(shí)間過(guò)長(zhǎng)的閑置連接還可為其他應(yīng)用系統(tǒng)并發(fā)連接至數(shù)據(jù)庫(kù)提供更多的連接機(jī)會(huì)。
實(shí)施例四
本實(shí)施例四公開一種基于讀寫分離的數(shù)據(jù)庫(kù)操作裝置,參考圖4示出的該裝置的結(jié)構(gòu)示意圖,其可以包括:
獲取單元41,用于獲得前端系統(tǒng)對(duì)后臺(tái)的目標(biāo)數(shù)據(jù)庫(kù)的操作請(qǐng)求;確定單元42,用于確定所述操作請(qǐng)求的請(qǐng)求類型,所述請(qǐng)求類型為讀請(qǐng)求或?qū)懻?qǐng)求中的任意一種;第一操作處理單元43,用于在所述操作請(qǐng)求的請(qǐng)求類型為寫請(qǐng)求時(shí),將所述操作請(qǐng)求分配至所述目標(biāo)數(shù)據(jù)庫(kù)的主數(shù)據(jù)庫(kù)進(jìn)行處理,以實(shí)現(xiàn)對(duì)所述主數(shù)據(jù)庫(kù)進(jìn)行寫操作;第二操作處理單元44,用于在所述操作請(qǐng)求的請(qǐng)求類型為讀請(qǐng)求時(shí),將所述操作請(qǐng)求分配至所述目標(biāo)數(shù)據(jù)庫(kù)的從數(shù)據(jù)庫(kù)進(jìn)行處理,以實(shí)現(xiàn)對(duì)從數(shù)據(jù)庫(kù)進(jìn)行讀操作;其中,所述目標(biāo)數(shù)據(jù)庫(kù)對(duì)應(yīng)至少一個(gè)主數(shù)據(jù)庫(kù)及至少一個(gè)從數(shù)據(jù)庫(kù),當(dāng)所述主數(shù)據(jù)庫(kù)的數(shù)據(jù)更新時(shí),基于數(shù)據(jù)庫(kù)復(fù)制技術(shù)對(duì)所述從數(shù)據(jù)庫(kù)進(jìn)行同步的數(shù)據(jù)更新,以使得所述從數(shù)據(jù)庫(kù)的數(shù)據(jù)與所述主數(shù)據(jù)庫(kù)的數(shù)據(jù)保持一致。
在本發(fā)明實(shí)施例的一實(shí)施方式中,所述確定單元,進(jìn)一步用于:解析所述操作請(qǐng)求;基于解析結(jié)果,確定所述操作請(qǐng)求的請(qǐng)求類型。
在本發(fā)明實(shí)施例的一實(shí)施方式中,所述第一操作處理單元,進(jìn)一步用于:從預(yù)先創(chuàng)建的兩個(gè)連接池中確定出與寫請(qǐng)求類型相對(duì)應(yīng)的第一連接池,所述第一連接池中包括已創(chuàng)建的能夠連接至所述目標(biāo)數(shù)據(jù)庫(kù)的主數(shù)據(jù)庫(kù)的多個(gè)連接;從所述第一連接池中選擇出一空閑的第一連接;利用所述空閑的第一連接,將所述操作請(qǐng)求路由至所述主數(shù)據(jù)庫(kù)。
在本發(fā)明實(shí)施例的一實(shí)施方式中,所述第二操作處理單元,進(jìn)一步用于:從預(yù)先創(chuàng)建的兩個(gè)連接池中確定出與讀請(qǐng)求類型相對(duì)應(yīng)的第二連接池,所述第二連接池中包括已創(chuàng)建的能夠連接至所述目標(biāo)數(shù)據(jù)庫(kù)的從數(shù)據(jù)庫(kù)的多個(gè)連接;從所述第二連接池中選擇出一空閑的第二連接;利用所述空閑的第二連接,將所述操作請(qǐng)求路由至所述從數(shù)據(jù)庫(kù)。
在本發(fā)明實(shí)施例的一實(shí)施方式中,所述裝置,還包括:釋放單元,用于在所述第一連接池和/或所述第二連接池中的任意一連接的空閑時(shí)長(zhǎng)達(dá)到預(yù)定閾值時(shí),釋放空閑時(shí)長(zhǎng)達(dá)到所述預(yù)定閾值的所述連接。
此處,需要說(shuō)明的是,本實(shí)施例涉及的基于讀寫分離的數(shù)據(jù)庫(kù)操作裝置的描述,與上文方法的描述是類似的,且同方法的有益效果描述,對(duì)于本發(fā)明的基于讀寫分離的數(shù)據(jù)庫(kù)操作裝置在本實(shí)施例中未披露的技術(shù)細(xì)節(jié),請(qǐng)參照本發(fā)明方法實(shí)施例的說(shuō)明,本實(shí)施對(duì)此不再作贅述。
需要說(shuō)明的是,本說(shuō)明書中的各個(gè)實(shí)施例均采用遞進(jìn)的方式描述,每個(gè)實(shí)施例重點(diǎn)說(shuō)明的都是與其他實(shí)施例的不同之處,各個(gè)實(shí)施例之間相同相似的部分互相參見即可。
為了描述的方便,描述以上系統(tǒng)或裝置時(shí)以功能分為各種模塊或單元分別描述。當(dāng)然,在實(shí)施本申請(qǐng)時(shí)可以把各單元的功能在同一個(gè)或多個(gè)軟件和/或硬件中實(shí)現(xiàn)。
通過(guò)以上的實(shí)施方式的描述可知,本領(lǐng)域的技術(shù)人員可以清楚地了解到本申請(qǐng)可借助軟件加必需的通用硬件平臺(tái)的方式來(lái)實(shí)現(xiàn)?;谶@樣的理解,本申請(qǐng)的技術(shù)方案本質(zhì)上或者說(shuō)對(duì)現(xiàn)有技術(shù)做出貢獻(xiàn)的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來(lái),該計(jì)算機(jī)軟件產(chǎn)品可以存儲(chǔ)在存儲(chǔ)介質(zhì)中,如ROM/RAM、磁碟、光盤等,包括若干指令用以使得一臺(tái)計(jì)算機(jī)設(shè)備(可以是個(gè)人計(jì)算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本申請(qǐng)各個(gè)實(shí)施例或者實(shí)施例的某些部分所述的方法。
最后,還需要說(shuō)明的是,在本文中,諸如第一、第二、第三和第四等之類的關(guān)系術(shù)語(yǔ)僅僅用來(lái)將一個(gè)實(shí)體或者操作與另一個(gè)實(shí)體或操作區(qū)分開來(lái),而不一定要求或者暗示這些實(shí)體或操作之間存在任何這種實(shí)際的關(guān)系或者順序。而且,術(shù)語(yǔ)“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過(guò)程、方法、物品或者設(shè)備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過(guò)程、方法、物品或者設(shè)備所固有的要素。在沒有更多限制的情況下,由語(yǔ)句“包括一個(gè)……”限定的要素,并不排除在包括所述要素的過(guò)程、方法、物品或者設(shè)備中還存在另外的相同要素。
以上所述僅是本發(fā)明的優(yōu)選實(shí)施方式,應(yīng)當(dāng)指出,對(duì)于本技術(shù)領(lǐng)域的普通技術(shù)人員來(lái)說(shuō),在不脫離本發(fā)明原理的前提下,還可以做出若干改進(jìn)和潤(rùn)飾,這些改進(jìn)和潤(rùn)飾也應(yīng)視為本發(fā)明的保護(hù)范圍。