本發(fā)明涉及數(shù)據(jù)處理技術(shù)領(lǐng)域,特別涉及一種實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離的方法和裝置。
背景技術(shù):
在互聯(lián)網(wǎng)數(shù)據(jù)庫解決方案中,MySQL(關(guān)系型數(shù)據(jù)庫)是一種比較常用的數(shù)據(jù)庫,MySQL在數(shù)據(jù)訪問并發(fā)量較高的情況下,一般會(huì)采用讀寫分離的技術(shù)實(shí)現(xiàn)數(shù)據(jù)的讀操作和寫操作,讀寫分離是指在數(shù)據(jù)庫中設(shè)置一個(gè)主庫和至少一個(gè)從庫,主庫中的數(shù)據(jù)實(shí)時(shí)同步到從庫中,主庫擔(dān)任寫操作,從庫擔(dān)任讀操作。
其中,主庫對(duì)應(yīng)的連接串,用于唯一標(biāo)識(shí)主庫,每個(gè)從庫對(duì)應(yīng)的連接串,用于唯一標(biāo)識(shí)從庫。當(dāng)某個(gè)應(yīng)用程序想要實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離時(shí),該應(yīng)用程序的開發(fā)人員先將主庫的連接串寫入該應(yīng)用程序包括的所有寫操作的SQL(Structured Query Language,結(jié)構(gòu)化查詢語言)語句中,將從庫的連接串寫入該應(yīng)用程序包括的所有讀操作的SQL語句中。在運(yùn)行該應(yīng)用程序時(shí),當(dāng)運(yùn)行到讀操作類型的SQL語句且該SQL語句中包括主庫的連接串時(shí),應(yīng)用程序根據(jù)主庫的連接串,從主庫中讀取該SQL語句對(duì)應(yīng)的數(shù)據(jù);當(dāng)運(yùn)行到讀操作類型的SQL語句且該SQL語句中包括從庫的連接串時(shí),應(yīng)用程序根據(jù)從庫的連接串,從從庫中讀取該SQL語句對(duì)應(yīng)的數(shù)據(jù)。
在實(shí)現(xiàn)本發(fā)明的過程中,發(fā)明人發(fā)現(xiàn)現(xiàn)有技術(shù)至少存在以下問題:
上述方法是通過編程實(shí)現(xiàn)讀寫分離,這樣增加了應(yīng)用程序的開發(fā)難度。
技術(shù)實(shí)現(xiàn)要素:
為了解決現(xiàn)有技術(shù)的問題,本發(fā)明提供了一種實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離的方法和裝置。技術(shù)方案如下:
一種實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離的方法,所述數(shù)據(jù)庫包括主庫和從庫,所述從庫是對(duì)所述主庫的備份,所述方法包括:
接收應(yīng)用服務(wù)器發(fā)送的結(jié)構(gòu)化查詢語言SQL訪問請(qǐng)求;
根據(jù)所述SQL訪問請(qǐng)求,獲取所述SQL訪問請(qǐng)求對(duì)應(yīng)的操作類型和所述SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí);
如果所述操作類型為寫操作類型,則將所述SQL訪問請(qǐng)求對(duì)應(yīng)的待寫入數(shù)據(jù)寫入所述主庫中;
如果所述操作類型為讀操作類型,根據(jù)所述請(qǐng)求標(biāo)識(shí)和讀寫分離表確定是否需要讀寫分離,如果需要讀寫分離,從所述從庫中讀取所述SQL訪問請(qǐng)求對(duì)應(yīng)的數(shù)據(jù),所述讀寫分離表包括需要進(jìn)行讀寫分離的SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí)。
優(yōu)選的,所述方法還包括:
根據(jù)讀寫信息記錄表,在所述讀寫分離表中添加或刪除SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí),所述讀寫信息記錄表用于存儲(chǔ)所述應(yīng)用服務(wù)器歷史發(fā)送的SQL訪問請(qǐng)求的讀寫信息;或者,
在所述讀寫分離表中添加或刪除用戶選擇的SQL訪問請(qǐng)求。
優(yōu)選的,所述根據(jù)讀寫信息記錄表,在所述讀寫分離表中添加或刪除SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí),包括:
從讀寫信息記錄表中選擇操作類型為讀操作類型且讀寫信息滿足預(yù)設(shè)讀寫分離條件的SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí),將所述選擇的請(qǐng)求標(biāo)識(shí)添加到所述讀寫分離表中;或者,
根據(jù)讀寫信息記錄表,從所述讀寫分離表中選擇讀寫信息不滿足預(yù)設(shè)讀寫分離條件的SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí),將所述選擇的請(qǐng)求標(biāo)識(shí),從所述讀寫分離表中刪除。
優(yōu)選的,所述方法還包括:
獲取所述SQL訪問請(qǐng)求的讀寫信息;
根據(jù)所述讀寫信息,更新所述讀寫信息記錄表中的所述SQL訪問請(qǐng)求對(duì)應(yīng)的讀寫信息。
優(yōu)選的,所述根據(jù)所述SQL訪問請(qǐng)求,獲取所述SQL訪問請(qǐng)求對(duì)應(yīng)的操作類型和所述SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí),包括:
解析所述SQL訪問請(qǐng)求,從所述SQL訪問請(qǐng)求中獲取所述SQL訪問請(qǐng)求對(duì)應(yīng)的操作類型;
對(duì)所述SQL訪問請(qǐng)求進(jìn)行歸一化處理,得到處理后的SQL訪問請(qǐng)求;
對(duì)所述處理后的SQL訪問請(qǐng)求進(jìn)行消息摘要算法第五版MD5類運(yùn)算,得到所述SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí)。
優(yōu)選的,如果所述數(shù)據(jù)庫包括多個(gè)從庫,所述從所述從庫中讀取所述SQL訪問請(qǐng)求對(duì)應(yīng)的數(shù)據(jù),包括:
從所述多個(gè)從庫中選擇從庫,從所述選擇的從庫中讀取所述SQL訪問請(qǐng)求對(duì)應(yīng)的數(shù)據(jù)。
優(yōu)選的,所述從所述多個(gè)從庫中選擇從庫,包括:
獲取所述多個(gè)從庫中的每個(gè)從庫的同步時(shí)延信息,根據(jù)所述每個(gè)從庫的同步時(shí)延信息,從所述多個(gè)從庫中選擇同步時(shí)延最小或者同步時(shí)延信息滿足所述SQL訪問請(qǐng)求對(duì)應(yīng)的同步時(shí)延要求的從庫;或者,
從所述讀寫分離表中獲取所述SQL訪問請(qǐng)求對(duì)應(yīng)的從庫,所述讀寫分離表還包括需要進(jìn)行讀寫分離的SQL訪問請(qǐng)求對(duì)應(yīng)的從庫;或者,
獲取所述多個(gè)從庫中的每個(gè)從庫的負(fù)載信息,根據(jù)所述每個(gè)從庫的負(fù)載信息,從所述多個(gè)從庫中選擇負(fù)載最小的從庫。
一種實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離的裝置,所述數(shù)據(jù)庫包括主庫和從庫,所述從庫是對(duì)所述主庫的備份,所述裝置包括:
接收模塊,用于接收應(yīng)用服務(wù)器發(fā)送的結(jié)構(gòu)化查詢語言SQL訪問請(qǐng)求;
第一獲取模塊,用于根據(jù)所述SQL訪問請(qǐng)求,獲取所述SQL訪問請(qǐng)求對(duì)應(yīng)的操作類型和所述SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí);
寫入模塊,用于如果所述操作類型為寫操作類型,則將所述SQL訪問請(qǐng)求對(duì)應(yīng)的待寫入數(shù)據(jù)寫入所述主庫中;
讀取模塊,用于如果所述操作類型為讀操作類型,根據(jù)所述請(qǐng)求標(biāo)識(shí)和讀寫分離表確定是否需要讀寫分離,如果需要讀寫分離,從所述從庫中讀取所述SQL訪問請(qǐng)求對(duì)應(yīng)的數(shù)據(jù),所述讀寫分離表包括需要進(jìn)行讀寫分離的SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí)。
優(yōu)選的,所述裝置還包括:
第一更新模塊,用于根據(jù)讀寫信息記錄表,在所述讀寫分離表中添加或刪除SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí),所述讀寫信息記錄表用于存儲(chǔ)所述應(yīng)用服務(wù)器歷史發(fā)送的SQL訪問請(qǐng)求的讀寫信息;或者,在所述讀寫分離表中添加或刪除用 戶選擇的SQL訪問請(qǐng)求。
優(yōu)選的,所述第一更新模塊,具體用于從讀寫信息記錄表中選擇操作類型為讀操作類型且讀寫信息滿足預(yù)設(shè)讀寫分離條件的SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí),將所述選擇的請(qǐng)求標(biāo)識(shí)添加到所述讀寫分離表中;或者,
所述第一更新模塊,具體用于根據(jù)讀寫信息記錄表,從所述讀寫分離表中選擇讀寫信息不滿足預(yù)設(shè)讀寫分離條件的SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí),將所述選擇的請(qǐng)求標(biāo)識(shí),從所述讀寫分離表中刪除。
優(yōu)選的,所述裝置還包括:
第二獲取模塊,用于獲取所述SQL訪問請(qǐng)求的讀寫信息;
第二更新模塊,用于根據(jù)所述讀寫信息,更新所述讀寫信息記錄表中的所述SQL訪問請(qǐng)求對(duì)應(yīng)的讀寫信息。
優(yōu)選的,所述第一獲取模塊,包括:
解析單元,用于解析所述SQL訪問請(qǐng)求,從所述SQL訪問請(qǐng)求中獲取所述SQL訪問請(qǐng)求對(duì)應(yīng)的操作類型;
處理單元,用于對(duì)所述SQL訪問請(qǐng)求進(jìn)行歸一化處理,得到處理后的SQL訪問請(qǐng)求;
計(jì)算單元,用于對(duì)所述處理后的SQL訪問請(qǐng)求進(jìn)行消息摘要算法第五版MD10類運(yùn)算,得到所述SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí)。
優(yōu)選的,所述讀取模塊,包括:
選擇單元,用于從所述多個(gè)從庫中選擇從庫;
讀取單元,用于從所述選擇的從庫中讀取所述SQL訪問請(qǐng)求對(duì)應(yīng)的數(shù)據(jù)。
優(yōu)選的,所述選擇單元,具體用于獲取所述多個(gè)從庫中的每個(gè)從庫的同步時(shí)延信息,根據(jù)所述每個(gè)從庫的同步時(shí)延信息,從所述多個(gè)從庫中選擇同步時(shí)延最小或者同步時(shí)延信息滿足所述SQL訪問請(qǐng)求對(duì)應(yīng)的同步時(shí)延要求的從庫;或者,
所述選擇單元,具體用于從所述讀寫分離表中獲取所述SQL訪問請(qǐng)求對(duì)應(yīng)的從庫,所述讀寫分離表還包括需要進(jìn)行讀寫分離的SQL訪問請(qǐng)求對(duì)應(yīng)的從庫;或者,
所述選擇單元,具體用于獲取所述多個(gè)從庫中的每個(gè)從庫的負(fù)載信息,根據(jù)所述每個(gè)從庫的負(fù)載信息,從所述多個(gè)從庫中選擇負(fù)載最小的從庫。
在本發(fā)明實(shí)施例中,事先配置讀寫分離表,讀寫分離表包括需要進(jìn)行讀寫分離的SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí);接收應(yīng)用服務(wù)器發(fā)送的SQL訪問請(qǐng)求;根據(jù)該SQL訪問請(qǐng)求,獲取該SQL訪問請(qǐng)求對(duì)應(yīng)的操作類型和該SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí);如果該操作類型為寫操作類型,則將該SQL訪問請(qǐng)求對(duì)應(yīng)的待寫入數(shù)據(jù)寫入主庫中;如果該操作類型為讀操作類型,根據(jù)該請(qǐng)求標(biāo)識(shí)和讀寫分離表確定是否需要讀寫分離,如果需要讀寫分離,從從庫中讀取該SQL訪問請(qǐng)求對(duì)應(yīng)的數(shù)據(jù),讀寫分離表。因此,本發(fā)明實(shí)施例通過配置讀寫分離表,實(shí)現(xiàn)數(shù)據(jù)庫的讀寫分離,從而應(yīng)用程序的開發(fā)人員不需要將主庫的連接串以及從庫的連接串寫入應(yīng)用程序中,減少了應(yīng)用程序的開發(fā)難度。
附圖說明
圖1-1是本發(fā)明實(shí)施例提供的一種實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離的應(yīng)用場景圖;
圖1-2是本發(fā)明實(shí)施例提供的一種實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離的方法流程圖;
圖2是本發(fā)明實(shí)施例提供的一種實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離的方法流程圖;
圖3-1是本發(fā)明實(shí)施例提供的一種實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離的裝置結(jié)構(gòu)示意圖;
圖3-2是本發(fā)明實(shí)施例提供的另一種實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離的裝置結(jié)構(gòu)示意圖;
圖3-3是本發(fā)明實(shí)施例提供的另一種實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離的裝置結(jié)構(gòu)示意圖;
圖3-4是本發(fā)明實(shí)施例提供的一種第一獲取模塊的裝置結(jié)構(gòu)示意圖;
圖3-5是本發(fā)明實(shí)施例提供的一種讀取模塊的裝置結(jié)構(gòu)示意圖。
具體實(shí)施方式
為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合附圖對(duì)本發(fā)明實(shí)施方式作進(jìn)一步地詳細(xì)描述。
參見圖1-1,本發(fā)明實(shí)施例提供了一種實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離的應(yīng)用場景圖,包括應(yīng)用服務(wù)器、代理服務(wù)器、數(shù)據(jù)庫的主庫(Master)和從庫(Slave1和Slave2)。代理服務(wù)器包括代理數(shù)據(jù)庫服務(wù)器(DBproxy)和管理服務(wù)器。
管理服務(wù)器用于配置讀寫分離表,讀寫分離表包括需要進(jìn)行讀寫分離的 SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí),并將讀寫分離表同步到代理數(shù)據(jù)庫服務(wù)器中。
管理服務(wù)器還用于在讀寫分離表中添加或刪除用戶選擇的SQL訪問請(qǐng)求。
管理服務(wù)器還用于接收運(yùn)維人員在讀寫信息記錄表中選擇的需要進(jìn)行讀寫分離的SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí),將運(yùn)維人員選擇的需要進(jìn)行讀寫分離的SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí)添加到讀寫分離表中;或者,
管理服務(wù)器還用于接收運(yùn)維人員在讀寫分離表中選擇的SQL訪問請(qǐng)求,將運(yùn)維人員選擇的需要進(jìn)行讀寫分離的SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí),從讀寫分離表中刪除。
管理服務(wù)器還用于根據(jù)讀寫信息記錄表,在讀寫分離表中添加或刪除SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí),讀寫信息記錄表用于存儲(chǔ)所用服務(wù)器歷史發(fā)送的SQL訪問請(qǐng)求的讀寫信息。
應(yīng)用服務(wù)器,用于在運(yùn)行應(yīng)用程序的SQL語句時(shí),向代理數(shù)據(jù)庫服務(wù)器發(fā)送SQL訪問請(qǐng)求。
代理數(shù)據(jù)庫服務(wù)器,用于接收應(yīng)用服務(wù)器發(fā)送的該SQL訪問請(qǐng)求;根據(jù)該SQL訪問請(qǐng)求,獲取該SQL訪問請(qǐng)求對(duì)應(yīng)的操作類型和該SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí)。
代理數(shù)據(jù)庫服務(wù)器,還用于如果該操作類型為寫操作類型,則將該SQL訪問請(qǐng)求對(duì)應(yīng)的待寫入數(shù)據(jù)寫入主庫中。
代理數(shù)據(jù)庫服務(wù)器,還用于如果該操作類型為讀操作類型,則根據(jù)該請(qǐng)求標(biāo)識(shí)和讀寫分離表確定是否需要讀寫分離。
代理數(shù)據(jù)庫服務(wù)器,還用于如果需要讀寫分離,從從庫中讀取該SQL訪問請(qǐng)求對(duì)應(yīng)的數(shù)據(jù);如果不需要讀寫分離,從主庫中讀取該SQL訪問請(qǐng)求對(duì)應(yīng)的數(shù)據(jù)。
本發(fā)明實(shí)施例提供了一種實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離的方法,數(shù)據(jù)庫包括主庫和從庫,從庫是對(duì)主庫的備份,從庫擔(dān)任讀能力的擴(kuò)展。該方法的執(zhí)行主體可以為數(shù)據(jù)庫服務(wù)器或者代理服務(wù)器。參見圖1-2,其中,該方法包括:
在步驟S101中,接收應(yīng)用服務(wù)器發(fā)送的SQL訪問請(qǐng)求。
在步驟S102中,根據(jù)該SQL訪問請(qǐng)求,獲取該SQL訪問請(qǐng)求對(duì)應(yīng)的操作類型和該SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí)。
操作類型包括讀操作類型和寫操作類型;請(qǐng)求標(biāo)識(shí)可以為唯一碼。
在步驟S103中,如果該操作類型為寫操作類型,則將該SQL訪問請(qǐng)求對(duì)應(yīng)的待寫入數(shù)據(jù)寫入主庫中。
在步驟S104中,如果該操作類型為讀操作類型,根據(jù)該請(qǐng)求標(biāo)識(shí)和讀寫分離表確定是否需要讀寫分離,如果需要讀寫分離,從從庫中讀取該SQL訪問請(qǐng)求對(duì)應(yīng)的數(shù)據(jù),讀寫分離表包括需要進(jìn)行讀寫分離的SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí)。
在本發(fā)明實(shí)施例中,事先配置讀寫分離表,讀寫分離表包括需要進(jìn)行讀寫分離的SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí);接收應(yīng)用服務(wù)器發(fā)送的SQL訪問請(qǐng)求;根據(jù)該SQL訪問請(qǐng)求,獲取該SQL訪問請(qǐng)求對(duì)應(yīng)的操作類型和該SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí);如果該操作類型為寫操作類型,則將該SQL訪問請(qǐng)求對(duì)應(yīng)的待寫入數(shù)據(jù)寫入主庫中;如果該操作類型為讀操作類型,根據(jù)該請(qǐng)求標(biāo)識(shí)和讀寫分離表確定是否需要讀寫分離,如果需要讀寫分離,從從庫中讀取該SQL訪問請(qǐng)求對(duì)應(yīng)的數(shù)據(jù),讀寫分離表。因此,本發(fā)明實(shí)施例通過配置讀寫分離表,實(shí)現(xiàn)數(shù)據(jù)庫的讀寫分離,從而應(yīng)用程序的開發(fā)人員不需要將主庫的連接串以及從庫的連接串寫入應(yīng)用程序中,減少了應(yīng)用程序的開發(fā)難度。
本發(fā)明實(shí)施例提供了一種實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離的方法,數(shù)據(jù)庫包括主庫和從庫,從庫是對(duì)主庫的備份,從庫擔(dān)任讀能力的擴(kuò)展。該方法的執(zhí)行主體可以為數(shù)據(jù)庫服務(wù)器或者代理服務(wù)器。在本發(fā)明實(shí)施例中,以該方法的執(zhí)行主體為代理服務(wù)器為例進(jìn)行說明。
其中,代理服務(wù)器包括代理數(shù)據(jù)庫服務(wù)器和管理服務(wù)器。參見圖2,該方法包括:
步驟201:接收應(yīng)用服務(wù)器發(fā)送的SQL訪問請(qǐng)求。
當(dāng)應(yīng)用服務(wù)器運(yùn)行應(yīng)用程序時(shí),向代理數(shù)據(jù)庫服務(wù)器發(fā)送SQL訪問請(qǐng)求;該SQL訪問請(qǐng)求不包括數(shù)據(jù)庫的連接串;代理數(shù)據(jù)庫服務(wù)器接收應(yīng)用服務(wù)器發(fā)送的該SQL訪問請(qǐng)求,執(zhí)行步驟202。
例如,該SQL訪問請(qǐng)求為select*from user where user_id=ahb;或者,該SQL訪問請(qǐng)求為insert into user(user_id,user_name,user_address)values(abc,efg,1112)。
步驟202:根據(jù)該SQL訪問請(qǐng)求,獲取該SQL訪問請(qǐng)求對(duì)應(yīng)的操作類型和 該SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí)。
操作類型包括讀操作類型和寫操作類型;請(qǐng)求標(biāo)識(shí)可以為唯一碼。本步驟可以通過以下步驟(1)至(3)實(shí)現(xiàn),包括:
(1):解析該SQL訪問請(qǐng)求,從該SQL訪問請(qǐng)求中獲取該SQL訪問請(qǐng)求對(duì)應(yīng)的操作類型。
代理數(shù)據(jù)庫服務(wù)器中存儲(chǔ)讀操作類型的SQL模板和寫操作類型的SQL模板;本步驟可以為:
解析該SQL訪問請(qǐng)求,如果該SQL訪問請(qǐng)求是與讀操作類型的SQL模板相匹配的SQL語句,確定該SQL訪問請(qǐng)求對(duì)應(yīng)的操作類型為讀操作類型;如果該SQL訪問請(qǐng)求是與寫操作類型的SQL模板相匹配的SQL語句,確定該SQL訪問請(qǐng)求對(duì)應(yīng)的操作類型為寫操作類型。
其中,讀操作類型的SQL模板可以為select*from user where user_id=xxxx,讀操作類型可以表示為R;寫操作類型的SQL模板可以為insert into user(user_id,user_name,user_address)values(xxxx,xxxx,xxxx),寫操作類型可以表示為W。
例如,解析該SQL訪問請(qǐng)求:select*from user where user_id=ahb,確定該SQL訪問請(qǐng)求為與讀操作類型的SQL模板(select*from user where user_id=xxxx)相匹配的SQL語句,確定該SQL訪問請(qǐng)求對(duì)應(yīng)的操作類型為讀操作類型。
再如,解析該SQL訪問請(qǐng)求:insert into user(user_id,user_name,user_address)values(abc,efg,1112),確定該SQL訪問請(qǐng)求為與寫操作類型的SQL模板(insert into user(user_id,user_name,user_address)values(xxxx,xxxx,xxxx))相匹配的SQL語句,確定該SQL訪問請(qǐng)求對(duì)應(yīng)的操作類型為寫操作類型。
(2):對(duì)該SQL訪問請(qǐng)求進(jìn)行歸一化處理,得到處理后的SQL訪問請(qǐng)求。
獲取預(yù)設(shè)標(biāo)準(zhǔn)格式,將該SQL訪問請(qǐng)求轉(zhuǎn)換為預(yù)設(shè)標(biāo)準(zhǔn)格式,以實(shí)現(xiàn)將該SQL訪問請(qǐng)求進(jìn)行歸一化處理,得到處理后的SQL訪問請(qǐng)求。
預(yù)設(shè)標(biāo)準(zhǔn)格式包括字符為小寫字符且標(biāo)識(shí)為預(yù)設(shè)標(biāo)識(shí)。例如,預(yù)設(shè)標(biāo)識(shí)可以xxxx等。
例如,將該SQL訪問請(qǐng)求:select*from user where user_id=ahb進(jìn)行歸一化處理,得到處理后的SQL訪問請(qǐng)求為select*from user where user_id=xxxx。
再如,將該SQL訪問請(qǐng)求:insert into user(user_id,user_name,user_address)values(abc,efg,1112)進(jìn)行歸一化處理,得到處理后的SQL訪問請(qǐng)求為:insert into user(user_id,user_name,user_address)values(xxxx,xxxx,xxxx)。
(3):對(duì)處理后的SQL訪問請(qǐng)求進(jìn)行MD5(Message Digest Algorithm,消息摘要算法第五版)類運(yùn)算,得到該SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí)。
計(jì)算處理后的SQL訪問請(qǐng)求的MD5值,將該MD5值作為該SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí)。
例如,計(jì)算處理后的SQL訪問請(qǐng)求:select*from user where user_id=xxxx的MD5值,得到該SQL訪問請(qǐng)求select*from user where user_id=ahb的請(qǐng)求標(biāo)識(shí)為c84faf6b47003b5c3124f560366352ba。
再如,計(jì)算處理后的SQL訪問請(qǐng)求:insert into user(user_id,user_name,user_address)values(xxxx,xxxx,xxxx)的MD5值,得到該SQL訪問請(qǐng)求insert into user(user_id,user_name,user_address)values(abc,efg,1112)的請(qǐng)求標(biāo)識(shí)為39de17bed8103fdd05ba98a82323a1e9。
步驟203:如果該操作類型為寫操作類型,則將該SQL訪問請(qǐng)求對(duì)應(yīng)的待寫入數(shù)據(jù)寫入主庫中,執(zhí)行步驟207。
由于主庫擔(dān)任寫操作,則如果該操作類型為寫操作類型,只能向主庫中寫數(shù)據(jù)。
步驟204:如果該操作類型為讀操作類型,根據(jù)該請(qǐng)求標(biāo)識(shí)和讀寫分離表確定是否需要讀寫分離。
由于主庫和從庫都能擔(dān)任讀操作,則如果該操作類型為讀操作類型,則需要確定是否需要讀寫分離,讀寫分離是指向主庫中寫數(shù)據(jù),從從庫中讀數(shù)據(jù)。
在本步驟之前,管理服務(wù)器通過配置,將需要進(jìn)行讀寫分離的SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí)添加到讀寫分離表中,也即讀寫分離表包括需要進(jìn)行讀寫分離的SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí)。將讀寫分離表分離表同步到代理數(shù)據(jù)庫服務(wù)器。
相應(yīng)的,本步驟可以為:
如果該操作類型為讀操作類型,代理數(shù)據(jù)庫服務(wù)器確定讀寫分離表是否包括該請(qǐng)求標(biāo)識(shí);如果讀寫分離表中包括該請(qǐng)求標(biāo)識(shí);確定該SQL訪問請(qǐng)求需要讀寫分離,執(zhí)行步驟205;如果讀寫分離表中不包括該請(qǐng)求標(biāo)識(shí),確定該SQL訪問請(qǐng)求不需要讀寫分離,執(zhí)行步驟206。
例如,讀寫分離表如下表1所示:
表1
管理服務(wù)器可以根據(jù)SQL訪問請(qǐng)求的讀寫信息自動(dòng)配置讀寫分離表,也可以由運(yùn)維人員手動(dòng)進(jìn)行配置。管理服務(wù)器配置讀寫分離表的過程在步驟209中詳細(xì)說明。
步驟205:如果需要讀寫分離,從從庫中讀取該SQL訪問請(qǐng)求對(duì)應(yīng)的數(shù)據(jù),執(zhí)行步驟207。
如果數(shù)據(jù)庫包括多個(gè)從庫,也即一個(gè)主庫對(duì)應(yīng)多個(gè)從庫,則從從庫中讀取該SQL訪問請(qǐng)求對(duì)應(yīng)的數(shù)據(jù)的步驟可以為:
從多個(gè)從庫中選擇一個(gè)從庫,從選擇的從庫中讀取該SQL訪問請(qǐng)求對(duì)應(yīng)的數(shù)據(jù)。
從多個(gè)從庫中選擇一個(gè)從庫的步驟可以通過以下第一種方式至第四種方式實(shí)現(xiàn),對(duì)于第一種實(shí)現(xiàn)方式,從多個(gè)從庫中選擇一個(gè)從庫的步驟可以為:
獲取多個(gè)從庫中的每個(gè)從庫的同步時(shí)延信息,根據(jù)每個(gè)從庫的同步延時(shí)信息,從多個(gè)從庫中選擇同步延時(shí)最小的從庫。
對(duì)于第二種實(shí)現(xiàn)方式,讀取分離表中還包括每個(gè)需要進(jìn)行讀寫分離的SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí)對(duì)應(yīng)的同步時(shí)延要求,相應(yīng)的,從多個(gè)從庫中選擇一個(gè)從庫的步驟可以為:
根據(jù)該請(qǐng)求標(biāo)識(shí),從讀寫分離表中獲取該請(qǐng)求標(biāo)識(shí)對(duì)應(yīng)的同步時(shí)延要求;根據(jù)每個(gè)從庫同步數(shù)據(jù)的同步時(shí)延信息,從多個(gè)從庫中選擇一個(gè)同步時(shí)延信息滿足該同步時(shí)延要求的從庫。
如果存在多個(gè)滿足該同步時(shí)延要求的從庫,從多個(gè)滿足該同步時(shí)延要求的從庫中隨機(jī)選擇一個(gè)從庫,或者,從多個(gè)滿足該同步時(shí)延要求的從庫中選擇一個(gè)同步時(shí)延最小的從庫,或者,從多個(gè)滿足該同步時(shí)延要求的從庫中選擇負(fù)載信息最小的從庫。
例如,存儲(chǔ)讀請(qǐng)求標(biāo)識(shí)對(duì)應(yīng)的同步時(shí)延要求的讀寫分離表如下表2所示:
表2
對(duì)于第三種實(shí)現(xiàn)方式,讀寫分離表中還存儲(chǔ)每個(gè)需要進(jìn)行讀寫分離的SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí)對(duì)應(yīng)的從庫的數(shù)據(jù)庫標(biāo)識(shí),相應(yīng)的,從多個(gè)從庫中選擇一個(gè)從庫的步驟可以為:
根據(jù)該請(qǐng)求標(biāo)識(shí),從讀寫分離表中獲取該SQL訪問請(qǐng)求對(duì)應(yīng)的從庫的數(shù)據(jù)庫標(biāo)識(shí)。
對(duì)于第四種實(shí)現(xiàn)方式,可以根據(jù)每個(gè)從庫的負(fù)載信息進(jìn)行選擇,相應(yīng)的,從多個(gè)從庫中選擇一個(gè)從庫的步驟可以為:
獲取每個(gè)從庫的負(fù)載信息,根據(jù)每個(gè)從庫的負(fù)載信息從多個(gè)從庫中選擇負(fù)載最小的從庫。
優(yōu)選的,從從庫中讀取該SQL訪問請(qǐng)求對(duì)應(yīng)的數(shù)據(jù)之后,向應(yīng)用服務(wù)器發(fā)送讀取的數(shù)據(jù);應(yīng)用服務(wù)器接收代理數(shù)據(jù)庫服務(wù)器發(fā)送的該數(shù)據(jù),根據(jù)該數(shù)據(jù)向代理數(shù)據(jù)庫服務(wù)器發(fā)送反饋信息;代理數(shù)據(jù)庫服務(wù)器接收應(yīng)用服務(wù)器發(fā)送的反饋信息,根據(jù)該反饋信息獲取該SQL訪問請(qǐng)求的處理結(jié)果,將該SQL訪問請(qǐng)求的處理結(jié)果同步到管理服務(wù)器。
優(yōu)選的,應(yīng)用服務(wù)器根據(jù)該數(shù)據(jù)向代理數(shù)據(jù)庫服務(wù)器發(fā)送反饋信息的步驟可以為:
如果該數(shù)據(jù)為目標(biāo)數(shù)據(jù),該反饋信息可以為成功指示消息,也即應(yīng)用服務(wù)器向代理數(shù)據(jù)庫服務(wù)器發(fā)送成功指示消息;如果該數(shù)據(jù)不是目標(biāo)數(shù)據(jù),該反饋信息可以為失敗指示消息,也即應(yīng)用服務(wù)器向代理數(shù)據(jù)庫服務(wù)器發(fā)送失敗指示消息。
代理數(shù)據(jù)庫服務(wù)器接收應(yīng)用服務(wù)器發(fā)送的反饋信息,根據(jù)該反饋信息獲取該SQL訪問請(qǐng)求的處理結(jié)果的步驟可以為:
代理數(shù)據(jù)庫服務(wù)器接收應(yīng)用服務(wù)器發(fā)送的反饋信息,如果該反饋信息為成功指示消息,確定處理該SQL訪問請(qǐng)求的處理結(jié)果為處理成功;如果該反饋信息為失敗指示消息,確定處理該SQL訪問請(qǐng)求的處理結(jié)果為處理失敗。
步驟206:如果不需要讀寫分離,從主庫中讀取該SQL訪問請(qǐng)求對(duì)應(yīng)的數(shù)據(jù)。
步驟207:獲取該SQL訪問請(qǐng)求的讀寫信息。
讀寫信息可以包括當(dāng)前訪問次數(shù)、處理時(shí)間以及處理結(jié)果等。
管理服務(wù)器獲取該SQL訪問請(qǐng)求的當(dāng)前訪問次數(shù)的步驟可以為:
管理服務(wù)器中存儲(chǔ)有歷史處理每個(gè)SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí)和歷史訪問次數(shù)的對(duì)應(yīng)關(guān)系,根據(jù)該SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí),從請(qǐng)求標(biāo)識(shí)和歷史訪問次數(shù)的對(duì)應(yīng)關(guān)系中獲取該SQL訪問請(qǐng)求的歷史訪問次數(shù),將歷史訪問次數(shù)加一得到該SQL訪問請(qǐng)求的當(dāng)前訪問次數(shù)。
管理服務(wù)器獲取該SQL訪問請(qǐng)求的處理時(shí)間的步驟可以為:
管理服務(wù)器獲取接收該SQL訪問請(qǐng)求的接收時(shí)間,以及向應(yīng)用服務(wù)器發(fā)送該數(shù)據(jù)的發(fā)送時(shí)間,計(jì)算發(fā)送時(shí)間和接收時(shí)間的時(shí)間差,將該時(shí)間差作為該SQL訪問請(qǐng)求的處理時(shí)間。
管理服務(wù)器獲取該SQL訪問請(qǐng)求的處理結(jié)果的步驟可以為:
管理服務(wù)器接收代理數(shù)據(jù)庫服務(wù)器同步的該SQL訪問請(qǐng)求的處理結(jié)果。
步驟208:根據(jù)該讀寫信息,更新讀寫信息記錄表中的該SQL訪問請(qǐng)求對(duì)應(yīng)的讀寫信息。
讀寫信息記錄表用于存儲(chǔ)應(yīng)用服務(wù)器歷史發(fā)送的SQL訪問請(qǐng)求的讀寫信息。本步驟可以通過以下步驟(1)至(3)實(shí)現(xiàn),包括:
(1):確定讀寫信息記錄表中是包括該SQL請(qǐng)求訪問的讀寫信息;如果包括,執(zhí)行步驟(2),如果不包括,執(zhí)行步驟(3)。
讀寫信息記錄表中存儲(chǔ)SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí)和讀寫信息的對(duì)應(yīng)關(guān)系;本步驟可以為:
管理服務(wù)器確定讀寫信息記錄表中是否包括該SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí);如果包括,確定讀寫信息記錄表中包括該SQL訪問請(qǐng)求的讀寫信息;如果不包括,確定讀寫信息記錄表中不包括該SQL訪問請(qǐng)求的讀寫信息。
(2):如果包括,根據(jù)該讀寫信息,更新讀寫信息記錄表中的該SQL訪問請(qǐng)求對(duì)應(yīng)的讀寫信息。
管理服務(wù)器根據(jù)該請(qǐng)求標(biāo)識(shí),從讀寫信息記錄表中獲取該請(qǐng)求標(biāo)識(shí)對(duì)應(yīng)的已存儲(chǔ)的讀寫信息,根據(jù)該讀寫信息和已存儲(chǔ)的讀寫信息,更新讀寫信息記錄表中的該SQL訪問請(qǐng)求對(duì)應(yīng)的讀寫信息。
讀寫信息可以包括當(dāng)前訪問次數(shù)、處理時(shí)間以及處理結(jié)果等。處理時(shí)間包 括最大處理時(shí)間、最小處理時(shí)間和平均處理時(shí)間,處理結(jié)果可以為失敗次數(shù)等。
則根據(jù)該讀寫信息和已存儲(chǔ)的讀寫信息,更新讀寫信息記錄表中的該SQL訪問請(qǐng)求對(duì)應(yīng)的讀寫信息的步驟可以為:
第一:將讀寫信息記錄表中的該SQL訪問請(qǐng)求的訪問次數(shù)修改為該SQL訪問請(qǐng)求的當(dāng)前訪問次數(shù)。
第二:如果該處理時(shí)間大于讀寫信息記錄表中該SQL訪問請(qǐng)求的最大處理時(shí)間,將讀寫信息記錄表中的該SQL訪問請(qǐng)求的最大處理時(shí)間修改為該處理時(shí)間;如果該處理時(shí)間小于讀寫信息記錄表中該SQL訪問請(qǐng)求的最小處理時(shí)間,將讀寫信息記錄表中的該SQL訪問請(qǐng)求的最小處理時(shí)間修改為該處理時(shí)間。如果該處理時(shí)間介于讀寫信息記錄表中該SQL訪問請(qǐng)求的最大處理時(shí)間和最小處理時(shí)間之間,則對(duì)讀寫信息記錄表中該SQL訪問請(qǐng)求的最大處理時(shí)間和最小處理時(shí)間不作處理。
第三:根據(jù)該處理時(shí)間和讀寫信息記錄表中的該SQL訪問請(qǐng)求的平均處理時(shí)間,計(jì)算更新后的平均處理時(shí)間,將讀寫信息記錄表中的該SQL訪問請(qǐng)求的平均處理時(shí)間修改為該更新后的平均處理時(shí)間。
第四:如果該處理結(jié)果為處理失敗,將讀寫信息記錄表中的該SQL訪問請(qǐng)求的失敗次數(shù)加一;如果該處理結(jié)果為處理成功,則對(duì)讀寫信息記錄表中的該SQL訪問請(qǐng)求的失敗次數(shù)不作處理。
(3):如果不包括,將該讀寫信息存儲(chǔ)到讀寫信息記錄表中。
將該請(qǐng)求標(biāo)識(shí)和讀寫信息的對(duì)應(yīng)關(guān)系存儲(chǔ)到讀寫信息記錄表中。
優(yōu)選的,讀寫信息記錄表中還存儲(chǔ)操作類型和SQL模板,則讀寫信息記錄表如下表3所示:
表3
優(yōu)選的,管理服務(wù)器顯示讀寫信息記錄表,從而運(yùn)維人員可以根據(jù)讀寫信息記錄表了解歷史處理SQL訪問請(qǐng)求的讀寫信息。
優(yōu)選的,讀寫信息記錄表還可以包括處理每個(gè)SQL訪問請(qǐng)求的從庫的數(shù)據(jù)庫標(biāo)識(shí),從而開發(fā)人員或者運(yùn)維人員可以根據(jù)讀寫信息記錄表了解各從庫的運(yùn)行狀態(tài)信息。
步驟209:根據(jù)更新后的讀寫信息記錄表,向讀寫分離表中添加或刪除SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí)。
具體地,管理服務(wù)器從更新后的讀寫信息記錄表中選擇操作類型為讀操作類型且讀寫信息滿足預(yù)設(shè)讀寫分離條件的SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí),將選擇的請(qǐng)求標(biāo)識(shí)添加到讀寫分離表中;或者,根據(jù)更新后的讀寫信息記錄表,從讀寫分離表中選擇讀寫信息不滿足預(yù)設(shè)讀寫分離條件的SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí),將選擇的請(qǐng)求標(biāo)識(shí),從讀寫分離表中刪除。
預(yù)設(shè)讀寫分離條件可以為訪問次數(shù)超過預(yù)設(shè)訪問次數(shù),最大處理時(shí)間超過第一預(yù)設(shè)時(shí)間,平均處理時(shí)間超過第二預(yù)設(shè)時(shí)間,失敗次數(shù)超過預(yù)設(shè)失敗次數(shù)中的一個(gè)或多個(gè)。
當(dāng)然,讀寫分離表也可以由運(yùn)維人員根據(jù)SQL訪問請(qǐng)求的業(yè)務(wù)類型進(jìn)行配置。則運(yùn)維人員配置讀寫分離表的步驟可以為:
管理服務(wù)器接收運(yùn)維人員從讀寫信息記錄表中選擇的需要進(jìn)行讀寫分離的SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí),將運(yùn)維人員選擇的需要進(jìn)行讀寫分離的SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí)添加到讀寫分離表中?;蛘撸?/p>
管理服務(wù)器接收運(yùn)維人員在讀寫分離表中選擇的SQL訪問請(qǐng)求,將運(yùn)維人員選擇的需要進(jìn)行讀寫分離的SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí),從讀寫分離表中刪除。
需要說明的是,管理服務(wù)器可以在代理數(shù)據(jù)庫服務(wù)器每接收一個(gè)SQL訪問請(qǐng)求,執(zhí)行一次更新讀寫分離表的操作,也可以每隔預(yù)設(shè)時(shí)長,更新一次讀寫分離表。
預(yù)設(shè)訪問次數(shù),第一預(yù)設(shè)時(shí)間,第二預(yù)設(shè)時(shí)間,預(yù)設(shè)失敗次數(shù)和預(yù)設(shè)時(shí)長都可以根據(jù)需要進(jìn)行設(shè)置并更改,在本發(fā)明實(shí)施例中,對(duì)預(yù)設(shè)訪問次數(shù),第一預(yù)設(shè)時(shí)間,第二預(yù)設(shè)時(shí)間,預(yù)設(shè)失敗次數(shù)和預(yù)設(shè)時(shí)長都不做具體限定。
在本發(fā)明實(shí)施例中,事先配置讀寫分離表,讀寫分離表包括需要進(jìn)行讀寫分離的SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí);接收應(yīng)用服務(wù)器發(fā)送的SQL訪問請(qǐng)求;根據(jù)該SQL訪問請(qǐng)求,獲取該SQL訪問請(qǐng)求對(duì)應(yīng)的操作類型和該SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí);如果該操作類型為寫操作類型,則將該SQL訪問請(qǐng)求對(duì)應(yīng)的待寫入數(shù)據(jù)寫入主庫中;如果該操作類型為讀操作類型,根據(jù)該請(qǐng)求標(biāo)識(shí)和讀寫分離表確定是否需要讀寫分離,如果需要讀寫分離,從從庫中讀取該SQL訪問請(qǐng)求對(duì)應(yīng)的數(shù)據(jù),讀寫分離表。因此,本發(fā)明實(shí)施例通過配置讀寫分離表,實(shí)現(xiàn)數(shù)據(jù)庫的讀寫分離,從而應(yīng)用程序的開發(fā)人員不需要將主庫的連接串以及從庫的連接串寫入應(yīng)用程序中,減少了應(yīng)用程序的開發(fā)難度。
本發(fā)明實(shí)施例提供了一種實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離的裝置,數(shù)據(jù)庫包括主庫和從庫,從庫是對(duì)主庫的備份,從庫擔(dān)任讀能力的擴(kuò)展,參見圖3-1,該裝置包括:
接收模塊301,用于接收應(yīng)用服務(wù)器發(fā)送的結(jié)構(gòu)化查詢語言SQL訪問請(qǐng)求;
第一獲取模塊302,用于根據(jù)該SQL訪問請(qǐng)求,獲取該SQL訪問請(qǐng)求對(duì)應(yīng)的操作類型和SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí);
寫入模塊303,用于如果該操作類型為寫操作類型,則將該SQL訪問請(qǐng)求對(duì)應(yīng)的待寫入數(shù)據(jù)寫入主庫中;
讀取模塊304,用于如果該操作類型為讀操作類型,根據(jù)該請(qǐng)求標(biāo)識(shí)和讀寫分離表確定是否需要讀寫分離,如果需要讀寫分離,從從庫中讀取該SQL訪問請(qǐng)求對(duì)應(yīng)的數(shù)據(jù),讀寫分離表包括需要進(jìn)行讀寫分離的SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí)。
優(yōu)選的,參見圖3-2,該裝置還包括:
第一更新模塊305,用于根據(jù)讀寫信息記錄表,在讀寫分離表中添加或刪除SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí),讀寫信息記錄表用于存儲(chǔ)應(yīng)用服務(wù)器歷史發(fā)送的SQL訪問請(qǐng)求的讀寫信息;或者,
在讀寫分離表中添加或刪除用戶選擇的SQL訪問請(qǐng)求。
優(yōu)選的,第一更新模塊305,具體用于從讀寫信息記錄表中選擇操作類型為 讀操作類型且讀寫信息滿足預(yù)設(shè)讀寫分離條件的SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí),將選擇的請(qǐng)求標(biāo)識(shí)添加到讀寫分離表中;或者,
第一更新模塊305,具體用于根據(jù)讀寫信息記錄表,從讀寫分離表中選擇讀寫信息不滿足預(yù)設(shè)讀寫分離條件的SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí),將選擇的請(qǐng)求標(biāo)識(shí),從讀寫分離表中刪除。
優(yōu)選的,參見圖3-3,該裝置還包括:
第二獲取模塊306,用于獲取SQL訪問請(qǐng)求的讀寫信息;
第二更新模塊307,用于根據(jù)該讀寫信息,更新讀寫信息記錄表中的該SQL訪問請(qǐng)求對(duì)應(yīng)的讀寫信息。
優(yōu)選的,參見圖3-4,第一獲取模塊302,包括:
解析單元3021,用于解析該SQL訪問請(qǐng)求,從該SQL訪問請(qǐng)求中獲取該SQL訪問請(qǐng)求對(duì)應(yīng)的操作類型;
處理單元3022,用于對(duì)該SQL訪問請(qǐng)求進(jìn)行歸一化處理,得到處理后的SQL訪問請(qǐng)求;
計(jì)算單元3023,用于對(duì)處理后的SQL訪問請(qǐng)求進(jìn)行消息摘要算法第五版MD10類運(yùn)算,得到該SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí)。
優(yōu)選的,參見圖3-5,讀取模塊304,包括:
選擇單元3041,用于從多個(gè)從庫中選擇從庫;
讀取單元3042,用于從選擇的從庫中讀取SQL訪問請(qǐng)求對(duì)應(yīng)的數(shù)據(jù)。
優(yōu)選的,選擇單元3041,具體用于獲取多個(gè)從庫中的每個(gè)從庫的同步時(shí)延信息,根據(jù)每個(gè)從庫的同步時(shí)延信息,從多個(gè)從庫中選擇同步時(shí)延最小或者同步時(shí)延信息滿足SQL訪問請(qǐng)求對(duì)應(yīng)的同步時(shí)延要求的從庫;或者,
選擇單元3041,具體用于從讀寫分離表中獲取SQL訪問請(qǐng)求對(duì)應(yīng)的從庫,讀寫分離表還包括需要進(jìn)行讀寫分離的SQL訪問請(qǐng)求對(duì)應(yīng)的從庫;或者,
選擇單元3041,具體用于獲取多個(gè)從庫中的每個(gè)從庫的負(fù)載信息,根據(jù)每個(gè)從庫的負(fù)載信息,從多個(gè)從庫中選擇負(fù)載最小的從庫。
在本發(fā)明實(shí)施例中,事先配置讀寫分離表,讀寫分離表包括需要進(jìn)行讀寫分離的SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí);接收應(yīng)用服務(wù)器發(fā)送的SQL訪問請(qǐng)求;根據(jù)該SQL訪問請(qǐng)求,獲取該SQL訪問請(qǐng)求對(duì)應(yīng)的操作類型和該SQL訪問請(qǐng)求的請(qǐng)求標(biāo)識(shí);如果該操作類型為寫操作類型,則將該SQL訪問請(qǐng)求對(duì)應(yīng)的待寫入 數(shù)據(jù)寫入主庫中;如果該操作類型為讀操作類型,根據(jù)該請(qǐng)求標(biāo)識(shí)和讀寫分離表確定是否需要讀寫分離,如果需要讀寫分離,從從庫中讀取該SQL訪問請(qǐng)求對(duì)應(yīng)的數(shù)據(jù),讀寫分離表。因此,本發(fā)明實(shí)施例通過配置讀寫分離表,實(shí)現(xiàn)數(shù)據(jù)庫的讀寫分離,從而應(yīng)用程序的開發(fā)人員不需要將主庫的連接串以及從庫的連接串寫入應(yīng)用程序中,減少了應(yīng)用程序的開發(fā)難度。
需要說明的是:上述實(shí)施例提供的實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離的裝置在實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離時(shí),僅以上述各功能模塊的劃分進(jìn)行舉例說明,實(shí)際應(yīng)用中,可以根據(jù)需要而將上述功能分配由不同的功能模塊完成,即將裝置的內(nèi)部結(jié)構(gòu)劃分成不同的功能模塊,以完成以上描述的全部或者部分功能。另外,上述實(shí)施例提供的實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離的裝置與實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離的方法實(shí)施例屬于同一構(gòu)思,其具體實(shí)現(xiàn)過程詳見方法實(shí)施例,這里不再贅述。
本領(lǐng)域普通技術(shù)人員可以理解實(shí)現(xiàn)上述實(shí)施例的全部或部分步驟可以通過硬件來完成,也可以通過程序來指令相關(guān)的硬件完成,所述的程序可以存儲(chǔ)于一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)中,上述提到的存儲(chǔ)介質(zhì)可以是只讀存儲(chǔ)器,磁盤或光盤等。
以上所述僅為本發(fā)明的較佳實(shí)施例,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。