專利名稱:一種主從分離數(shù)據(jù)庫的讀寫方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本申請涉及數(shù)據(jù)庫領(lǐng)域,特別是涉及一種主從分離數(shù)據(jù)庫的讀寫方法和系統(tǒng)。
背景技術(shù):
在大型企業(yè)應(yīng)用中,由于大數(shù)據(jù)量和大并發(fā)訪問,數(shù)據(jù)庫很容易成為性能瓶頸。解決這個問題的方法之一是主從讀寫分離,即采用兩個或多個數(shù)據(jù)庫,其中一個為主數(shù)據(jù)庫, 主數(shù)據(jù)庫可以讀寫,其它為從數(shù)據(jù)庫庫,從數(shù)據(jù)庫只讀,通過數(shù)據(jù)庫管理系統(tǒng)提供的同步機制與主數(shù)據(jù)庫同步數(shù)據(jù)。這種方式可以將只讀操作轉(zhuǎn)到從數(shù)據(jù)庫,從而減輕主數(shù)據(jù)庫的壓力。但是主數(shù)據(jù)庫到從數(shù)據(jù)庫的同步不能做到完全實時,即主數(shù)據(jù)庫到從數(shù)據(jù)庫的同步存在一定的時間延遲,如果對主數(shù)據(jù)庫完成寫操作后,立即從從數(shù)據(jù)庫讀數(shù)據(jù),由于存在時延,可能會讀不到剛修改的數(shù)據(jù)。比如對于修改用戶資料的請求這個請求包含兩個數(shù)據(jù)庫操作,首先更新數(shù)據(jù)庫用戶資料,然后查詢用戶資料并顯示。用戶提交修改用戶資料的請求,由于該請求中包含寫操作,該寫操作切換到主數(shù)據(jù)庫執(zhí)行;修改完成之后該請求會立即查詢用戶資料并顯示,但是查詢操作會切換到從數(shù)據(jù)庫執(zhí)行,由于主從同步的延遲,主數(shù)據(jù)庫的修改還沒同步到從數(shù)據(jù)庫,到從數(shù)據(jù)庫查詢?nèi)〉降氖切薷闹暗臄?shù)據(jù),從用戶的角度看,就是更新沒有成功, 但實際上主數(shù)據(jù)庫已經(jīng)更新成功,只是還沒同步到從數(shù)據(jù)庫?,F(xiàn)有技術(shù)一般是通過緩存技術(shù)來解決上述主從數(shù)據(jù)庫的時延問題,比如Memcache 等緩存技術(shù);其中,Memcache是一個高性能的分布式的內(nèi)存對象緩存系統(tǒng),通過在內(nèi)存里維護一個統(tǒng)一的巨大的hash (哈希)表,它能夠用來存儲各種格式的數(shù)據(jù),包括圖像、視頻、 文件以及數(shù)據(jù)庫檢索的結(jié)果等。在現(xiàn)有的緩存技術(shù)中,當(dāng)一個用戶請求對應(yīng)的業(yè)務(wù)操作中的寫操作執(zhí)行后,會在內(nèi)存中緩存被更新的對象,之后的查詢先從內(nèi)存中讀取,并不會立即從從數(shù)據(jù)庫讀數(shù)據(jù),從而避免了主從同步的時延問題。但是使用緩存技術(shù)需要考慮緩存副本數(shù)據(jù)與數(shù)據(jù)庫中數(shù)據(jù)的一致性,還需要考慮緩存失效及緩存對象替換機制,而且緩存相對于數(shù)據(jù)庫中海量的數(shù)據(jù)來說,其容量有限;另外,如果采用分布式緩存技術(shù)還要考慮緩存之間的同步問題。因此, 緩存技術(shù)這種解決方案設(shè)計復(fù)雜,實施成本較高,尤其針對遺留系統(tǒng)的改造,一般需要改動已有程序,上述解決方案設(shè)計更為復(fù)雜,實施成本更高。因此,目前需要本領(lǐng)域技術(shù)人員迫切解決的一個技術(shù)問題就是如何簡單可靠的解決主從數(shù)據(jù)庫系統(tǒng)中讀寫分離時,當(dāng)用戶請求中包括先進行寫操作后進行讀操作而產(chǎn)生的主從同步的時延問題。
發(fā)明內(nèi)容
本申請所要解決的技術(shù)問題是提供一種主從分離數(shù)據(jù)庫的讀寫方法和系統(tǒng),將對應(yīng)用戶請求的業(yè)務(wù)操作內(nèi)進行更新的表進行記錄,并將該業(yè)務(wù)操作內(nèi)后續(xù)所有對該表的操作都切換到主數(shù)據(jù)庫執(zhí)行,簡單可靠的避免了從從數(shù)據(jù)庫讀數(shù)據(jù)的同步時延問題。
為了解決上述問題,本申請公開了一種主從分離數(shù)據(jù)庫的讀寫方法,包括根據(jù)用戶請求確認(rèn)對應(yīng)該請求的業(yè)務(wù)操作;對所述業(yè)務(wù)操作中的SQL語句序列,逐條分析處理每一條SQL語句需要操作的表判斷是否對該表需要進行修改操作,如果是,則對所述表名進行記錄;如果否,則不記錄所述表名;以及,判斷記錄的表名中是否包含當(dāng)前SQL語句需要操作的表的表名,如果包含, 則將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行,反之,則將當(dāng)前SQL語句切換到從數(shù)據(jù)庫執(zhí)行。優(yōu)選的,通過以下步驟分析處理每一條SQL語句需要操作的表步驟Al,通過SQL分析器提取當(dāng)前SQL語句需要操作的表的表名,分析是否對該表需要進行修改操作,如果是,則將所述表名插入更新記錄器;步驟A2,通過數(shù)據(jù)源切換器提取當(dāng)前SQL語句需要操作的表的表名,查詢所述更新記錄器中是否包含所述表名,如果包含,則將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行,反之, 則將當(dāng)前SQL語句切換到從數(shù)據(jù)庫執(zhí)行。優(yōu)選的,通過以下步驟分析處理每一條SQL語句需要操作的表步驟Bi,通過SQL分析器提取當(dāng)前SQL語句需要操作的表的表名,分析是否對該表需要進行修改操作,如果是,則將該表名插入更新記錄器;步驟B2,通過SQL分析器查詢所述更新記錄器中是否包含所述表名,并將查詢結(jié)果通知數(shù)據(jù)源切換器;步驟B3,通過數(shù)據(jù)源切換器接收查詢結(jié)果,如果所述更新記錄器中包含所述表名, 則將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行,反之,則將當(dāng)前SQL語句切換到從數(shù)據(jù)庫執(zhí)行。優(yōu)選的,針對所述SQL語句序列,從第一條SQL語句開始,逐條進行處理之前包含 清空更新記錄器;和/或,在所有SQL語句序列執(zhí)行完畢之后包含清空更新記錄器。優(yōu)選的,所述業(yè)務(wù)操作為用戶請求在服務(wù)器端的處理過程。優(yōu)選的,所述的修改操作包括插入,和/或刪除,和/或更新。相應(yīng)的,本申請還公開了一種主從分離數(shù)據(jù)庫的讀寫系統(tǒng),包括確認(rèn)模塊,用于根據(jù)用戶請求確認(rèn)對應(yīng)該請求的業(yè)務(wù)操作;SQL語句處理模塊,用于對所述業(yè)務(wù)操作中的SQL語句序列,逐條分析處理每一條 SQL語句需要操作的表的表名判斷其是否對該表需要進行修改操作,如果是,則對所述表名進行記錄;如果否, 則不記錄所述表名;以及,判斷表名的記錄中是否包含當(dāng)前SQL語句需要操作的表的表名,如果包含, 則將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行,反之,則將當(dāng)前SQL語句切換到從數(shù)據(jù)庫執(zhí)行。優(yōu)選的,所述SQL語句處理模塊包括更新記錄器,SQL分析器和數(shù)據(jù)源切換器;所述SQL分析器用于提取當(dāng)前SQL語句需要操作的表的表名,分析是否對該表需要進行修改操作,如果是,則將所述表名插入更新記錄器;所述用于數(shù)據(jù)源切換器提取當(dāng)前 SQL語句需要操作的表的表名,查詢所述更新記錄器中是否包含所述表名,如果包含,則將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行,反之,則將當(dāng)前SQL語句切換到從數(shù)據(jù)庫執(zhí)行;所述更新記錄器用于存儲進行了修改操作的表名。
5
優(yōu)選的,所述SQL語句處理模塊包括更新記錄器,SQL分析器和數(shù)據(jù)源切換器;所述SQL分析器用于提取當(dāng)前SQL語句需要操作的表的表名,分析是否對該表需要進行修改操作,如果是,則將該表名插入更新記錄器;查詢所述更新記錄器中是否包含所述表名;所述數(shù)據(jù)源切換器用于,當(dāng)所述更新記錄器中包含所述表名,則將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行,反之,則將當(dāng)前SQL語句切換到從數(shù)據(jù)庫執(zhí)行。本申請還公開了另外一種主從分離數(shù)據(jù)庫的讀寫方法,包括根據(jù)用戶請求確認(rèn)對應(yīng)該請求的業(yè)務(wù)操作;對所述業(yè)務(wù)操作中的SQL語句序列,逐條分析處理每一條SQL語句如果該SQL語句涉及修改操作,則將其需要操作的表名進行記錄,并將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行;如果該SQL語句涉及查詢操作,則進一步判斷表名記錄中是否包括當(dāng)前SQL語句需要操作的表名,如果包含,則將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行,反之,則將當(dāng)前SQL語句切換到從數(shù)據(jù)庫執(zhí)行。優(yōu)選的,所述的修改操作包括插入,和/或刪除,和/或更新。優(yōu)選的,所述的查詢操作包括選擇、和/或查找、和/或排序、和/或總數(shù)、和/或求和、和/或平均、和/或最大、和/或最小。與現(xiàn)有技術(shù)相比,本申請包含以下優(yōu)點本申請通過在應(yīng)用層對用戶請求對應(yīng)的業(yè)務(wù)操作中的SQLGtructured Query Language,結(jié)構(gòu)化查詢語言)語句序列逐條進行分析處理,如果當(dāng)前SQL語句涉及修改操作,那么將其需要操作的表名進行記錄;判斷表名記錄中是否包括當(dāng)前的SQl語句需要操作的表名,如果包含,則將當(dāng)前的SQL語句切換到主數(shù)據(jù)庫執(zhí)行。通過將用戶請求對應(yīng)的業(yè)務(wù)操作中的SQL語句序列中進行了修改操作的表的記錄,可以將該業(yè)務(wù)操作的后續(xù)所有對該表的操作都切換進入主數(shù)據(jù)庫執(zhí)行,不用過多的復(fù)雜的設(shè)計,在很低的成本下即可簡單可靠的避免主從數(shù)據(jù)庫同步的時延問題。
圖1是本申請一種主從分離數(shù)據(jù)庫的讀寫方法的流程示意圖;圖2是本申請優(yōu)選的SQL語句處理流程示意圖;圖3是本申請另一種優(yōu)選的SQL語句處理流程示意圖;圖4是本申請另一種主從分離數(shù)據(jù)庫的讀寫方法的流程示意圖;圖5是本申請一種主從分離數(shù)據(jù)庫的讀寫系統(tǒng)的結(jié)構(gòu)示意圖;圖6是本申請優(yōu)選的SQL語句處理模塊的結(jié)構(gòu)示意圖。
具體實施例方式為使本申請的上述目的、特征和優(yōu)點能夠更加明顯易懂,下面結(jié)合附圖和具體實施方式
對本申請作進一步詳細(xì)的說明。本申請?zhí)峁┝艘环N主從分離數(shù)據(jù)庫的讀寫方法和系統(tǒng),通過在應(yīng)用層對用戶請求對應(yīng)的業(yè)務(wù)操作中的SQL語句序列逐條進行分析處理,如果當(dāng)前SQL語句涉及修改操作,那么將其需要操作的表名進行記錄;判斷表名記錄中是否包括當(dāng)前的SQl語句需要操作的表名,如果包含,則將當(dāng)前的SQL語句切換到主數(shù)據(jù)庫執(zhí)行。通過將用戶請求對應(yīng)的業(yè)務(wù)操作中的SQL語句序列中進行了修改操作的表的記錄,可以將該業(yè)務(wù)操作的后續(xù)所有對該表的操作都切換進入主數(shù)據(jù)庫執(zhí)行,相對于緩存技術(shù)那種復(fù)雜的設(shè)計和高昂的成本,本申請不用采用過多的復(fù)雜的設(shè)計,在很低的成本下即可簡單可靠的避免主從數(shù)據(jù)庫同步的時延問題。參照圖1,示出了本申請一種主從分離數(shù)據(jù)庫的讀寫方法,包括步驟110,根據(jù)用戶請求確認(rèn)對應(yīng)該請求的業(yè)務(wù)操作。所述的業(yè)務(wù)操作為用戶請求在服務(wù)器端的處理過程。當(dāng)服務(wù)器端接收到用戶的請求后,服務(wù)器端可以根據(jù)該用戶請求處理的入口及出口來確定該次業(yè)務(wù)操作的開始和結(jié)束。例如在J2EE(Java 2 Platform Enterprise Edition,提供中間層集成框架用來滿足無需太多費用而又需要高可用性、高可靠性以及可擴展性的應(yīng)用的需求)技術(shù)框架下,處理的入口為Servlet (Servlet是一種服務(wù)器端的Java應(yīng)用程序,具有獨立于平臺和協(xié)議的特性,可以生成動態(tài)的Web頁面)接收到用戶的請求,出口為業(yè)務(wù)邏輯處理完畢發(fā)送HTTP Response (HTTP響應(yīng)頭)給客戶端。在實際中,業(yè)務(wù)操作的開始和結(jié)束可以根據(jù)實際情況進行定義。步驟120,對所述業(yè)務(wù)操作中的SQL語句序列,逐條分析處理每一條SQL語句需要操作的表步驟121,判斷是否對該表需要進行修改操作,如果是,則轉(zhuǎn)入步驟121a,如果否, 則轉(zhuǎn)入步驟121b ;步驟121a,對所述表名進行記錄;步驟121b,不記錄所述表名;步驟122,判斷記錄的表名中是否包含當(dāng)前SQL語句需要操作的表的表名,如果包含,則轉(zhuǎn)入步驟122a,反之,則轉(zhuǎn)入步驟12 ;步驟122a,將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行;步驟122b,將當(dāng)前SQL語句切換到從數(shù)據(jù)庫執(zhí)行。在實際中,上述業(yè)務(wù)操作也即用戶請求在服務(wù)器端的處理過程中包含了若干條 SQL語句,這些SQL語句根據(jù)實際的處理過程存在一定的先后順序,即上述業(yè)務(wù)操作包括了 SQL語句序列,而本申請利用上述的SQL語句序列進行分析處理。在分析處理所述SQL語句序列時,根據(jù)SQL語句序列的順序,逐條分析處理每一條 SQL語句需要操作的表判斷是否對該表需要進行修改操作,如果是,則對所述表名進行記錄;如果否,則不記錄所述表名;以及,判斷記錄的表名中是否包含當(dāng)前SQL語句需要操作的表的表名,如果包含, 則將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行,反之,則將當(dāng)前SQL語句切換到從數(shù)據(jù)庫執(zhí)行。優(yōu)選的,參照圖2通過以下步驟分析處理每一條SQL語句需要操作的表步驟Al,通過SQL分析器提取當(dāng)前SQL語句需要操作的表的表名,分析是否對該表需要進行修改操作,如果是,則將所述表名插入更新記錄器。例如,對于所述SQL語句序列中第一條SQL語句"UPDATE A SET A. a = 1, A. b = 2”,SQL分析器提取該SQL語句需要操作的表的表名A,并分析該SQL語句的需要進行的操作“UPDATE”是修改操作,則將表名A插入更新記錄器,此時更新記錄器結(jié)果為{A}。如果不是,則不進行任何操作,即不將該表插入更新記錄器。其中,所述的修改操作包括插入,和/或刪除,和/或更新等對表進行修改的操作, 比如"insert", "delete", "update"等操作命令。步驟A2,通過數(shù)據(jù)源切換器提取當(dāng)前SQL語句需要操作的表的表名,查詢所述更新記錄器中是否包含所述表名,如果包含,則將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行,反之, 則將當(dāng)前SQL語句切換到從數(shù)據(jù)庫執(zhí)行。當(dāng)步驟Al將處理過的SQL語句傳入數(shù)據(jù)源切換器時,數(shù)據(jù)源切換器提取當(dāng)前SQL 語句需要操作的表名,并從所述的更新記錄器中查詢其記錄中是否包含當(dāng)前SQL語句所要操作的表名,如果包含,則將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行,反之,則將當(dāng)前SQL語句切換到從數(shù)據(jù)庫執(zhí)行。比如前述SQL語句UPDATE A SET A. a = 1,A. b = 2”,數(shù)據(jù)源切換器提取其表名為A,查詢更新記錄器的記錄結(jié)果{A}中包括表名A,則將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行。在步驟Al,當(dāng)SQL語句序列中有多個表需要進行修改操作,則可將所有需要進行修改操作的表的表名插入更新記錄器。比如當(dāng)上述SQL語句序列中第二條SQL語句為 "UPDATE B SET B. m = 3,B. η = 4” SQL分析器提取該SQL語句需要操作的表的表名B,并分析該SQL語句的需要進行的操作“UPDATE”是修改操作,則將表名B插入更新記錄器,此時更新記錄器結(jié)果為{A,B}。另外,針對所述SQL語句序列,從第一條SQL語句開始,逐條進行處理之前包含清
空更新記錄器。和/或,在所有SQL語句序列執(zhí)行完畢之后包含清空更新記錄器。在實際中,可以清空更新記錄器為一個表名的空集合。下面以一個示例說明本申請的處理SQL語句序列的一個優(yōu)選方案步驟一、根據(jù)用戶請求確認(rèn)對應(yīng)該請求的業(yè)務(wù)操作。步驟二、清空更新記錄器為表名的空集合{}。步驟三、對于該業(yè)務(wù)操作中包含的SQL語句序列U SELECWROM A ;2、SELECT*FR0M B ;3、UPDATE A SET A. a = 1,A. b = 2 ;4、UPDATE B SET B. m = 1,B. η = 2 ;5、SELECT*FR0M A ;6、SELECT*FR0M B ;7、SELECT*FR0M C。進行逐條分析處理首先對第1條SQL語句“SELECT*FR0M Α”進行分析處理通過步驟Al,SQL分析器提取“SELECT*FR0M Α”需要操作的表的表名為A,由于 “SELECT”不是修改操作,是查詢操作,不插入更新記錄器;通過步驟A2,數(shù)據(jù)源切換器提取“SELECT*FR0M Α”需要操作的表的表名A,查詢到更新記錄器中沒有表名A的記錄,切換“SELECT*FR0MA”到從數(shù)據(jù)庫執(zhí)行。
再對第2條SQL語句“ SELECT*FR0M B ”進行分析處理通過步驟Al,SQL分析器提取“SELECT*FR0M B”需要操作的表的表名為B,由于 “SELECT”不是修改操作,是查詢操作,不插入更新記錄器;通過步驟A2,數(shù)據(jù)源切換器提取“SELECT*FR0M B”需要操作的表的表名B,查詢到更新記錄器中沒有表名B的記錄,切換“SELECT*FR0MB”到從數(shù)據(jù)庫執(zhí)行。再對第3條SQL語句“UPDATE A SET A. a = 1,A. b = 2”進行分析處理通過步驟Al,SQL分析器提取“UPDATE A SET A. a = l,A.b = 2”需要操作的表的表名為A,由于“UPDATE”是修改操作,插入更新記錄器,則更新記錄器結(jié)果為{A};通過步驟A2,數(shù)據(jù)源切換器提取“UPDATE A SET A. a = 1,A. b = 2”需要操作的表的表名A,查詢到更新記錄器中有表名A的記錄,切換“UPDATE A SET A. a = 1,A. b = 2” 到主數(shù)據(jù)庫執(zhí)行。再對第4條SQL語句“UPDATE B SET B. m = 1,B. η = 2”進行分析處理通過步驟Al,SQL分析器提取“UPDATE B SET B. m = Ι,Β.η = 2”需要操作的表的表名為B,由于“UPDATE”是修改操作,插入更新記錄器,則更新記錄器結(jié)果為{A,B};通過步驟A2,數(shù)據(jù)源切換器提取“UPDATE B SET B. m = 1,B. η = 2”需要操作的表的表名B,查詢到更新記錄器中有表名B的記錄,切換“UPDATE B SET B. m = Ι,Β.η = 2" 到主數(shù)據(jù)庫執(zhí)行。再對第5條SQL語句“SELECT*FR0M Α”進行分析處理通過步驟Al,SQL分析器提取“SELECT*FR0M Α”需要操作的表的表名為A,由于 “SELECT”不是修改操作,是查詢操作,不插入更新記錄器;通過步驟A2,數(shù)據(jù)源切換器提取“SELECT*FR0M Α”需要操作的表的表名A,查詢到更新記錄器中有表名A的記錄,切換“SELECT*FR0M Α”到主數(shù)據(jù)庫執(zhí)行。再對第6條SQL語句“ SELECT*FR0M B ”進行分析處理通過步驟Al,SQL分析器提取“SELECT*FR0M B”需要操作的表的表名為B,由于 “SELECT”不是修改操作,是查詢操作,不插入更新記錄器;通過步驟A2,數(shù)據(jù)源切換器提取“SELECT*FR0M B”需要操作的表的表名B,查詢到更新記錄器中有表名B的記錄,切換“SELECT*FR0M B”到主數(shù)據(jù)庫執(zhí)行。再對第7條SQL語句“SELECT*FR0M C”進行分析處理通過步驟Al,SQL分析器提取“SELECT*FR0M C”需要操作的表的表名為C,由于 “SELECT”不是修改操作,是查詢操作,不插入更新記錄器;通過步驟A2,數(shù)據(jù)源切換器提取“SELECT*FR0M C”需要操作的表的表名C,查詢到更新記錄器中沒有表名C的記錄,切換“SELECT*FR0M C”到從數(shù)據(jù)庫執(zhí)行。由上可見,由于在第3條語句中對表A進行了修改操作,在第4條語句中對表B進行了修改操作,之后的第5條針對表A的查詢操作和第6條針對表B的查詢操作也被切換到主數(shù)據(jù)庫執(zhí)行,從而避免了主從不同步的問題。而第1條針對表A的操作,第2條針對表 B的操作和第7條針對表C的操作,由于沒有修改操作,并且更新記錄器中沒有相應(yīng)表名記錄,則都會切換到從數(shù)據(jù)庫執(zhí)行。優(yōu)選的,參照圖3,本申請還可通過以下步驟分析處理每一條SQL語句需要操作的表步驟Bi,通過SQL分析器提取當(dāng)前SQL語句需要操作的表的表名,分析是否對該表需要進行修改操作,如果是,則將該表名插入更新記錄器;步驟B2,通過SQL分析器查詢所述更新記錄器中是否包含所述表名,并將查詢結(jié)果通知數(shù)據(jù)源切換器;步驟B3,通過數(shù)據(jù)源切換器接收查詢結(jié)果,如果所述更新記錄器中包含所述表名, 則將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行,反之,則將當(dāng)前SQL語句切換到從數(shù)據(jù)庫執(zhí)行。本方案與前述方案最大的區(qū)別在于通過SQL分析器將當(dāng)前的SQL語句是否包含更新記錄器中記錄的表名的查詢結(jié)果直接通知給數(shù)據(jù)源切換器,數(shù)據(jù)源切換器不用再進行判斷而直接根據(jù)SQL分析器的查詢結(jié)果選擇將當(dāng)前的SQL語句切換到主數(shù)據(jù)庫執(zhí)行還是切換到從數(shù)據(jù)庫執(zhí)行。本申請對于SQL分析的方法不加以限定,任何能夠提取SQL語句表名和分析當(dāng)前 SQL語句對所述表名進行哪種操作的具體方法都可適用于本申請。另外,還可以通過如下步驟對所述業(yè)務(wù)操作中的SQL語句序列,逐條分析處理每一條SQL語句步驟S121,判斷該SQL語句是否為修改操作或查詢操作;步驟S122,如果是修改操作,則將其需要操作的表名進行記錄,并將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行;步驟S123,如果是查詢操作,則進一步判斷表名記錄中是否包括當(dāng)前SQL語句需要操作的表名,如果包含,則將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行,反之,則將當(dāng)前SQL語句切換到從數(shù)據(jù)庫執(zhí)行。在實際中,首先可通過SQL分析器判斷當(dāng)前的SQL語句執(zhí)行的是修改操作還是查詢操作;如果是修改操作,則將其需要操作的表名插入更新記錄器,并通知數(shù)據(jù)源切換器將該SQL語句切換到主庫數(shù)據(jù)執(zhí)行;如果是查詢操作,則可通過SQL分析器查詢更新記錄器中記錄的表名是否包括當(dāng)前SQL語句需要操作的表名,如果包含,則通知數(shù)據(jù)源切換器將該SQL語句切換到主數(shù)據(jù)庫執(zhí)行,如果不包含,則通知數(shù)據(jù)源切換器將該SQL語句切換到從數(shù)據(jù)庫執(zhí)行;或者可通過數(shù)據(jù)源切換器查詢更新記錄器中記錄的表名是否包括當(dāng)前SQL語句需要操作的表名,如果包含,則將該SQL語句切換到主數(shù)據(jù)庫執(zhí)行,如果不包含,則將該SQL語句切換到從數(shù)據(jù)庫執(zhí)行。參照圖4,其示出了本申請另一種主從分離數(shù)據(jù)庫的讀寫方法,包括步驟210,根據(jù)用戶請求確認(rèn)對應(yīng)該請求的業(yè)務(wù)操作;步驟220,對所述業(yè)務(wù)操作中的SQL語句序列,逐條分析處理每一條SQL語句步驟221,如果該SQL語句涉及修改操作,則將其需要操作的表名進行記錄,并將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行;步驟222,如果該SQL語句涉及查詢操作,則進一步判斷表名記錄中是否包括當(dāng)前 SQL語句需要操作的表名,如果包含,則轉(zhuǎn)入步驟22加,反之,則轉(zhuǎn)入步驟222b ;步驟22加,將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行;
步驟222b,將當(dāng)前SQL語句切換到從數(shù)據(jù)庫執(zhí)行。所述的修改操作包括插入,和/或刪除,和/或更新等對表進行修改的操作。所述的查詢操作包括選擇、和/或查找、和/或排序、和/或總數(shù)、和/或求和、和 /或平均、和/或最大、和/或最小等對表進行查詢的操作。對于如何分析當(dāng)前SQL語句涉及的是修改操作還是查詢操作,前面實施例具有詳細(xì)描述,為了簡便,在此不再贅述。參照圖5,其示出了本申請一種主從分離數(shù)據(jù)庫的讀寫系統(tǒng),包括確認(rèn)模塊310,用于根據(jù)用戶請求確認(rèn)對應(yīng)該請求的業(yè)務(wù)操作;SQL語句處理模塊320,用于對所述業(yè)務(wù)操作中的SQL語句序列,逐條分析處理每一條SQL語句需要操作的表的表名判斷其是否對該表需要進行修改操作,如果是,則對所述表名進行記錄;如果否, 則不記錄所述表名;判斷表名的記錄中是否包含當(dāng)前SQL語句需要操作的表的表名,如果包含,則將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行,反之,則將當(dāng)前SQL語句切換到從數(shù)據(jù)庫執(zhí)行。優(yōu)選的,參照圖6,SQL語句處理模塊包括更新記錄器410,SQL分析器420和數(shù)據(jù)源切換器430 ;所述SQL分析器用于提取當(dāng)前SQL語句需要操作的表的表名,分析是否對該表需要進行修改操作,如果是,則將所述表名插入更新記錄器;所述用于數(shù)據(jù)源切換器提取當(dāng)前SQL語句需要操作的表的表名,查詢所述更新記錄器中是否包含所述表名,如果包含,則將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行440,反之,則將當(dāng)前SQL語句切換到從數(shù)據(jù)庫執(zhí)行450 ;所述更新記錄器用于存儲進行了修改操作的表名。優(yōu)選的,所述SQL語句處理模塊包括更新記錄器,SQL分析器和數(shù)據(jù)源切換器;所述SQL分析器用于提取當(dāng)前SQL語句需要操作的表的表名,分析是否對該表需要進行修改操作,如果是,則將該表名插入更新記錄器;并查詢所述更新記錄器中是否包含所述表名;所述數(shù)據(jù)源切換器用于,當(dāng)所述更新記錄器中包含所述表名,則將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行,反之,則將當(dāng)前SQL語句切換到從數(shù)據(jù)庫執(zhí)行。對于系統(tǒng)實施例而言,由于其與方法實施例基本相似,所以描述的比較簡單,相關(guān)之處參見方法實施例的部分說明即可。本申請可以在由計算機執(zhí)行的計算機可執(zhí)行指令的一般上下文中描述,例如程序模塊。一般地,程序模塊包括執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型的例程、程序、對象、組件、數(shù)據(jù)結(jié)構(gòu)等等。也可以在分布式計算環(huán)境中實踐本申請,在這些分布式計算環(huán)境中,由通過通信網(wǎng)絡(luò)而被連接的遠(yuǎn)程處理設(shè)備來執(zhí)行任務(wù)。在分布式計算環(huán)境中,程序模塊可以位于包括存儲設(shè)備在內(nèi)的本地和遠(yuǎn)程計算機存儲介質(zhì)中。本說明書中的各個實施例均采用遞進的方式描述,每個實施例重點說明的都是與其他實施例的不同之處,各個實施例之間相同相似的部分互相參見即可。以上對本申請所提供的一種主從分離數(shù)據(jù)庫的讀寫方法和系統(tǒng),進行了詳細(xì)介紹,本文中應(yīng)用了具體個例對本申請的原理及實施方式進行了闡述,以上實施例的說明只
11是用于幫助理解本申請的方法及其核心思想;同時,對于本領(lǐng)域的一般技術(shù)人員,依據(jù)本申請的思想,在具體實施方式
及應(yīng)用范圍上均會有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理解為對本申請的限制。
權(quán)利要求
1.一種主從分離數(shù)據(jù)庫的讀寫方法,其特征在于,包括 根據(jù)用戶請求確認(rèn)對應(yīng)該請求的業(yè)務(wù)操作;對所述業(yè)務(wù)操作中的SQL語句序列,逐條分析處理每一條SQL語句需要操作的表 判斷是否對該表需要進行修改操作,如果是,則對所述表名進行記錄;如果否,則不記錄所述表名;以及,判斷記錄的表名中是否包含當(dāng)前SQL語句需要操作的表的表名,如果包含,則將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行,反之,則將當(dāng)前SQL語句切換到從數(shù)據(jù)庫執(zhí)行。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,通過以下步驟分析處理每一條SQL語句需要操作的表步驟Al,通過SQL分析器提取當(dāng)前SQL語句需要操作的表的表名,分析是否對該表需要進行修改操作,如果是,則將所述表名插入更新記錄器;步驟A2,通過數(shù)據(jù)源切換器提取當(dāng)前SQL語句需要操作的表的表名,查詢所述更新記錄器中是否包含所述表名,如果包含,則將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行,反之,則將當(dāng)前SQL語句切換到從數(shù)據(jù)庫執(zhí)行。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,通過以下步驟分析處理每一條SQL語句需要操作的表步驟Bi,通過SQL分析器提取當(dāng)前SQL語句需要操作的表的表名,分析是否對該表需要進行修改操作,如果是,則將該表名插入更新記錄器;步驟B2,通過SQL分析器查詢所述更新記錄器中是否包含所述表名,并將查詢結(jié)果通知數(shù)據(jù)源切換器;步驟B3,通過數(shù)據(jù)源切換器接收查詢結(jié)果,如果所述更新記錄器中包含所述表名,則將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行,反之,則將當(dāng)前SQL語句切換到從數(shù)據(jù)庫執(zhí)行。
4.如權(quán)利要求2或3所述的方法,其特征在于針對所述SQL語句序列,從第一條SQL語句開始,逐條進行處理之前包含清空更新記錄器;和/或,在所有SQL語句序列執(zhí)行完畢之后包含清空更新記錄器。
5.根據(jù)權(quán)利要求1所述的方法,其特征在于 所述業(yè)務(wù)操作為用戶請求在服務(wù)器端的處理過程。
6.如權(quán)利要求1所述的方法,其特征在于所述的修改操作包括插入,和/或刪除,和/或更新。
7.—種主從分離數(shù)據(jù)庫的讀寫系統(tǒng),其特征在于,包括 確認(rèn)模塊,用于根據(jù)用戶請求確認(rèn)對應(yīng)該請求的業(yè)務(wù)操作;SQL語句處理模塊,用于對所述業(yè)務(wù)操作中的SQL語句序列,逐條分析處理每一條SQL 語句需要操作的表的表名判斷其是否對該表需要進行修改操作,如果是,則對所述表名進行記錄;如果否,則不記錄所述表名;以及,判斷表名的記錄中是否包含當(dāng)前SQL語句需要操作的表的表名,如果包含,則將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行,反之,則將當(dāng)前SQL語句切換到從數(shù)據(jù)庫執(zhí)行。
8.如權(quán)利要求7所述的系統(tǒng),其特征在于所述SQL語句處理模塊包括更新記錄器,SQL分析器和數(shù)據(jù)源切換器;所述SQL分析器用于提取當(dāng)前SQL語句需要操作的表的表名,分析是否對該表需要進行修改操作,如果是,則將所述表名插入更新記錄器;所述用于數(shù)據(jù)源切換器提取當(dāng)前SQL 語句需要操作的表的表名,查詢所述更新記錄器中是否包含所述表名,如果包含,則將當(dāng)前 SQL語句切換到主數(shù)據(jù)庫執(zhí)行,反之,則將當(dāng)前SQL語句切換到從數(shù)據(jù)庫執(zhí)行;所述更新記錄器用于存儲進行了修改操作的表名。
9.如權(quán)利要求7所述的系統(tǒng),其特征在于所述SQL語句處理模塊包括更新記錄器,SQL分析器和數(shù)據(jù)源切換器;所述SQL分析器用于提取當(dāng)前SQL語句需要操作的表的表名,分析是否對該表需要進行修改操作,如果是,則將該表名插入更新記錄器;查詢所述更新記錄器中是否包含所述表名;所述數(shù)據(jù)源切換器用于,當(dāng)所述更新記錄器中包含所述表名,則將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行,反之,則將當(dāng)前SQL語句切換到從數(shù)據(jù)庫執(zhí)行。
10.一種主從分離數(shù)據(jù)庫的讀寫方法,其特征在于,包括根據(jù)用戶請求確認(rèn)對應(yīng)該請求的業(yè)務(wù)操作;對所述業(yè)務(wù)操作中的SQL語句序列,逐條分析處理每一條SQL語句如果該SQL語句涉及修改操作,則將其需要操作的表名進行記錄,并將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行;如果該SQL語句涉及查詢操作,則進一步判斷表名記錄中是否包括當(dāng)前SQL語句需要操作的表名,如果包含,則將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行,反之,則將當(dāng)前SQL語句切換到從數(shù)據(jù)庫執(zhí)行。
11.如權(quán)利要求10所述的方法,其特征在于所述的修改操作包括插入,和/或刪除,和/或更新。
12.如權(quán)利要求10所述的方法,其特征在于所述的查詢操作包括選擇、和/或查找、和/或排序、和/或總數(shù)、和/或求和、和/或平均、和/或最大、和/或最小。
全文摘要
本申請?zhí)峁┝艘环N主從分離數(shù)據(jù)庫的讀寫方法,涉及數(shù)據(jù)庫領(lǐng)域。所述的方法包括根據(jù)用戶請求確認(rèn)對應(yīng)該請求的業(yè)務(wù)操作;對所述業(yè)務(wù)操作中的SQL語句序列,逐條分析處理每一條SQL語句需要操作的表判斷是否對該表需要進行修改操作,如果是,則對所述表名進行記錄;判斷記錄的表名中是否包含當(dāng)前SQL語句需要操作的表的表名,如果包含,則將當(dāng)前SQL語句切換到主數(shù)據(jù)庫執(zhí)行。本申請通過將用戶請求對應(yīng)的業(yè)務(wù)操作中的SQL語句序列中進行了修改操作的表的記錄,可將該業(yè)務(wù)操作的后續(xù)所有對該表的操作都切換進入主數(shù)據(jù)庫執(zhí)行,不用過多的復(fù)雜的設(shè)計,在很低的成本下即可簡單可靠的避免主從數(shù)據(jù)庫同步的時延問題。
文檔編號G06F17/30GK102402596SQ20111035012
公開日2012年4月4日 申請日期2011年11月7日 優(yōu)先權(quán)日2011年11月7日
發(fā)明者張順, 李劍, 王磊 申請人:北京搜狗科技發(fā)展有限公司