本發(fā)明涉及計(jì)算機(jī)領(lǐng)域,尤其涉及一種數(shù)據(jù)庫(kù)緩存控制方法以及系統(tǒng)。
背景技術(shù):
目前的大多數(shù)網(wǎng)頁(yè)都是使用動(dòng)態(tài)數(shù)據(jù)與靜態(tài)樣式生成,其中動(dòng)態(tài)的數(shù)據(jù)常常保存在關(guān)系型數(shù)據(jù)庫(kù),比如oracle,mysql,sqlserver等等。為了提高網(wǎng)頁(yè)生成的速度,往往會(huì)使用數(shù)據(jù)庫(kù)緩存技術(shù),即從數(shù)據(jù)庫(kù)查詢出來的數(shù)據(jù)在本次生成網(wǎng)頁(yè)后不馬上銷毀,而是存在一個(gè)能夠快速讀取的地方(比如內(nèi)存),下次等這個(gè)網(wǎng)頁(yè)再次被請(qǐng)求的時(shí)候,便可從緩存中快速取出這個(gè)數(shù)據(jù),無需再次查詢數(shù)據(jù)庫(kù),從而提高網(wǎng)頁(yè)生成的速度,提高網(wǎng)站的吞吐量,降低用戶等待的時(shí)間,提升用戶體驗(yàn)。
從數(shù)據(jù)庫(kù)查詢數(shù)據(jù)需要傳入查詢語(yǔ)句和查詢參數(shù),緩存技術(shù)把查詢語(yǔ)句和查詢參數(shù)合在一起作為本次的查詢關(guān)鍵字,在查詢出結(jié)果后,存入鍵值對(duì)結(jié)構(gòu)的緩存中。在之后的每次查詢中,都使用當(dāng)次的關(guān)鍵字到緩存中查找數(shù)據(jù),假如存在數(shù)據(jù)則直接返回,不存在則執(zhí)行數(shù)據(jù)庫(kù)查詢操作。
當(dāng)緩存中的數(shù)據(jù)所對(duì)應(yīng)的數(shù)據(jù)庫(kù)中的數(shù)據(jù)被改變時(shí),必須清空這個(gè)緩存數(shù)據(jù),否則用戶看到的將會(huì)是過時(shí)的數(shù)據(jù)。從數(shù)據(jù)庫(kù)查詢數(shù)據(jù)需要傳入查詢語(yǔ)句和查詢參數(shù),更新數(shù)據(jù)庫(kù)需要傳入更新語(yǔ)句和更新參數(shù)。緩存技術(shù)的關(guān)鍵點(diǎn)在于,如何判斷一個(gè)更新操作是否影響了某個(gè)查詢操作。
現(xiàn)在比較成熟且被大家接受的方案是把所有的查詢語(yǔ)句和更新語(yǔ)句按照命名空間來分類,當(dāng)執(zhí)行了某個(gè)命名空間下的任意一條更新語(yǔ)句,則清空該命名空間下所有查詢語(yǔ)句的緩存。開發(fā)人員必須保證更新語(yǔ)句只能更新本命名空間所覆蓋的數(shù)據(jù),而不能更新本命名空間之外的數(shù)據(jù)。
但是,在關(guān)系型數(shù)據(jù)庫(kù)查詢中,查詢語(yǔ)句通常需要跨越多表,在這種錯(cuò)綜復(fù)雜的情況下,很難把這些查詢語(yǔ)句按照命名空間進(jìn)行分類,最終大部分查詢語(yǔ)句都會(huì)被分在同一個(gè)命名空間內(nèi),然后只要執(zhí)行其中一條更新語(yǔ)句,所有的緩存便會(huì)清空,從而導(dǎo)致緩存命中率非常低,緩存技術(shù)起不到明顯的效果。另外,在現(xiàn)有的技術(shù)下,由開發(fā)人員來使用命名空間的方式來聲明查詢語(yǔ)句與更新語(yǔ)句的關(guān)聯(lián)關(guān)系,無形中也增加了工作難度,提高了出錯(cuò)的風(fēng)險(xiǎn)。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明要解決的技術(shù)問題在于,針對(duì)現(xiàn)有技術(shù)的上述缺陷,提供一種數(shù)據(jù)庫(kù)緩存控制方法以及系統(tǒng)。
本發(fā)明解決其技術(shù)問題所采用的技術(shù)方案是:構(gòu)造一種數(shù)據(jù)庫(kù)緩存控制方法,包括:
s0、在緩存中創(chuàng)建以下映射表:查詢關(guān)鍵字與結(jié)果數(shù)據(jù)一對(duì)一的第一映射表、查詢語(yǔ)句和更新語(yǔ)句與表名一對(duì)多的第二映射表、表名與查詢關(guān)鍵字一對(duì)多的第三映射表;其中,所述查詢關(guān)鍵字由查詢語(yǔ)句和查詢參數(shù)組合得到;
s1、針對(duì)每次的數(shù)據(jù)查詢執(zhí)行步驟s2,針對(duì)每次的數(shù)據(jù)更新執(zhí)行步驟s3;
s2、查詢第一映射表,如第一映射表無查詢結(jié)果則查詢數(shù)據(jù)庫(kù),并基于數(shù)據(jù)庫(kù)查詢結(jié)果更新第一映射表以及基于查詢所涉及到的表名更新第二映射表和第三映射表;
s3、執(zhí)行數(shù)據(jù)庫(kù)更新后,基于更新所涉及到的表名更新第一映射表、第二映射表和第三映射表。
在本發(fā)明所述的數(shù)據(jù)庫(kù)緩存控制方法中,所述步驟s2具體包括:
s21、利用查詢語(yǔ)句與查詢參數(shù)組合得到查詢關(guān)鍵字,基于該查詢關(guān)鍵字查詢緩存中的第一映射表,如果存在結(jié)果數(shù)據(jù)則返回該結(jié)果數(shù)據(jù)并結(jié)束本次查詢;如果不存在結(jié)果數(shù)據(jù),則執(zhí)行步驟s22;
s22、基于查詢語(yǔ)句與查詢參數(shù)查詢數(shù)據(jù)庫(kù),并把查詢關(guān)鍵字作為鍵、數(shù)據(jù)庫(kù)查詢結(jié)果作為值保存到第一映射表;
s23、將查詢語(yǔ)句作為鍵從第二映射表查找查詢語(yǔ)句包含的所有表名,如果存在結(jié)果數(shù)據(jù)則跳到步驟s25,否則執(zhí)行步驟s24;
s24、基于sql語(yǔ)法規(guī)則解析查詢語(yǔ)句,并獲取查詢語(yǔ)句包含的所有表名,并將查詢語(yǔ)句作為鍵、查詢語(yǔ)句包含的所有表名作為值保存到第二映射表;
s25、將查詢語(yǔ)句包含的所有表名均作為鍵、查詢關(guān)鍵字作為值保存至第三映射表。
在本發(fā)明所述的數(shù)據(jù)庫(kù)緩存控制方法中,所述步驟s3具體包括:
s31、執(zhí)行數(shù)據(jù)庫(kù)更新操作;
s32、將更新語(yǔ)句作為鍵從第二映射表查找更新語(yǔ)句包含的所有表名,如果存在結(jié)果數(shù)據(jù),則跳轉(zhuǎn)至步驟s34,否則執(zhí)行步驟s33;
s33、基于sql語(yǔ)法規(guī)則解析更新語(yǔ)句,并獲取更新語(yǔ)句包含的所有表名,并將更新語(yǔ)句作為鍵、更新語(yǔ)句包含的所有表名作為值保存到第二映射表;
s34、將更新語(yǔ)句包含的所有表名均作為鍵,從第三映射表查找所有的查詢關(guān)鍵字;
s35、從第一映射表中清除查找到的查詢關(guān)鍵字及其對(duì)應(yīng)的結(jié)果數(shù)據(jù);
s36、從第三映射表中清除更新語(yǔ)句包含的所有表名及其對(duì)應(yīng)的查詢關(guān)鍵字。
本發(fā)明還公開了一種數(shù)據(jù)庫(kù)緩存控制系統(tǒng),包括:
初始化模塊,用于在緩存中創(chuàng)建以下映射表:查詢關(guān)鍵字與結(jié)果數(shù)據(jù)一對(duì)一的第一映射表、查詢語(yǔ)句和更新語(yǔ)句與表名一對(duì)多的第二映射表、表名與查詢關(guān)鍵字一對(duì)多的第三映射表;其中,所述查詢關(guān)鍵字由查詢語(yǔ)句和查詢參數(shù)組合得到;
查詢模塊,用于針對(duì)每次的數(shù)據(jù)查詢,查詢第一映射表,如第一映射表無查詢結(jié)果則查詢數(shù)據(jù)庫(kù),并基于數(shù)據(jù)庫(kù)查詢結(jié)果更新第一映射表以及基于查詢所涉及到的表名更新第二映射表和第三映射表;
更新模塊,用于針對(duì)每次的數(shù)據(jù)更新,執(zhí)行數(shù)據(jù)庫(kù)更新后,基于更新所涉及到的表名更新第一映射表、第二映射表和第三映射表。
在本發(fā)明所述的數(shù)據(jù)庫(kù)緩存控制系統(tǒng)中,所述查詢模塊包括:
第一映射表查詢子模塊,用于利用查詢語(yǔ)句與查詢參數(shù)組合得到查詢關(guān)鍵字,基于該查詢關(guān)鍵字查詢緩存中的第一映射表,如果存在結(jié)果數(shù)據(jù)則返回該結(jié)果數(shù)據(jù)并結(jié)束本次查詢;如果不存在結(jié)果數(shù)據(jù),則觸發(fā)數(shù)據(jù)庫(kù)查詢子模塊工作;
數(shù)據(jù)庫(kù)查詢子模塊,用于基于查詢語(yǔ)句與查詢參數(shù)查詢數(shù)據(jù)庫(kù),并將數(shù)據(jù)庫(kù)查詢結(jié)果發(fā)送至第一映射表更新子模塊一;
第一映射表更新子模塊一,用于把查詢關(guān)鍵字作為鍵、數(shù)據(jù)庫(kù)查詢結(jié)果作為值保存到第一映射表,并觸發(fā)第二映射表查詢子模塊一工作;
第二映射表查詢子模塊一,用于將查詢語(yǔ)句作為鍵從第二映射表查找查詢語(yǔ)句包含的所有表名,如果存在結(jié)果數(shù)據(jù)則觸發(fā)第三映射表更新子模塊工作,否則觸發(fā)語(yǔ)句解析及第二映射表更新子模塊一工作;
語(yǔ)句解析及第二映射表更新子模塊一,用于基于sql語(yǔ)法規(guī)則解析查詢語(yǔ)句,并獲取查詢語(yǔ)句包含的所有表名,并將查詢語(yǔ)句作為鍵、查詢語(yǔ)句包含的所有表名作為值保存到第二映射表,并觸發(fā)第三映射表更新子模塊一工作;
第三映射表更新子模塊一,用于將查詢語(yǔ)句包含的所有表名均作為鍵、查詢關(guān)鍵字作為值保存至第三映射表。
在本發(fā)明所述的數(shù)據(jù)庫(kù)緩存控制系統(tǒng)中,所述更新模塊包括:
數(shù)據(jù)庫(kù)更新子模塊,用于執(zhí)行數(shù)據(jù)庫(kù)更新操作,并觸發(fā)第二映射表查詢子模塊二工作;
第二映射表查詢子模塊二,用于將更新語(yǔ)句作為鍵從第二映射表查找更新語(yǔ)句包含的所有表名,如果存在結(jié)果數(shù)據(jù),則觸發(fā)第三映射表查詢子模塊工作,否則觸發(fā)語(yǔ)句解析及第二映射表更新子模塊二工作;
語(yǔ)句解析及第二映射表更新子模塊二,用于基于sql語(yǔ)法規(guī)則解析更新語(yǔ)句,并獲取更新語(yǔ)句包含的所有表名,并將更新語(yǔ)句作為鍵、更新語(yǔ)句包含的所有表名作為值保存到第二映射表,并觸發(fā)第三映射表查詢子模塊工作;
第三映射表查詢子模塊,用于將更新語(yǔ)句包含的所有表名均作為鍵,從第三映射表查找所有的查詢關(guān)鍵字,并觸發(fā)第一映射表更新子模塊二工作;
第一映射表更新子模塊二,用于從第一映射表中清除查找到的查詢關(guān)鍵字及其對(duì)應(yīng)的結(jié)果數(shù)據(jù),并觸發(fā)第三映射表更新子模塊二工作;
第三映射表更新子模塊二,用于從第三映射表中清除更新語(yǔ)句包含的所有表名及其對(duì)應(yīng)的查詢關(guān)鍵字。
實(shí)施本發(fā)明的數(shù)據(jù)庫(kù)緩存控制方法以及系統(tǒng),具有以下有益效果:本發(fā)明在緩存中利用三個(gè)映射表存儲(chǔ)查詢數(shù)據(jù),通過確定查詢語(yǔ)句和更新語(yǔ)句所包含的表名,根據(jù)表名來存儲(chǔ)或清除相關(guān)的緩存數(shù)據(jù),如此可以更精確地判斷查詢語(yǔ)句和更新語(yǔ)句之間的關(guān)系,每次執(zhí)行更新操作后只清空局部真正關(guān)聯(lián)的緩存,保留不關(guān)聯(lián)的緩存,而不是大范圍進(jìn)行清空,最終能夠顯著提高緩存命中率,提高數(shù)據(jù)訪問平均速度,提升用戶體驗(yàn),降低軟件開發(fā)難度,讓開發(fā)人員專注業(yè)務(wù)邏輯開發(fā),提高開發(fā)效率,降低軟件出錯(cuò)率,提升軟件質(zhì)量。
附圖說明
為了更清楚地說明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)提供的附圖獲得其他的附圖:
圖1是本發(fā)明的數(shù)據(jù)庫(kù)緩存控制方法的流程圖;
圖2是較佳實(shí)施例在數(shù)據(jù)查詢時(shí)的流程圖;
圖3是較佳實(shí)施例在數(shù)據(jù)更新時(shí)的流程圖。
具體實(shí)施方式
為了便于理解本發(fā)明,下面將參照相關(guān)附圖對(duì)本發(fā)明進(jìn)行更全面的描述。附圖中給出了本發(fā)明的典型實(shí)施例。但是,本發(fā)明可以以許多不同的形式來實(shí)現(xiàn),并不限于本文所描述的實(shí)施例。相反地,提供這些實(shí)施例的目的是使對(duì)本發(fā)明的公開內(nèi)容更加透徹全面。
除非另有定義,本文所使用的所有的技術(shù)和科學(xué)術(shù)語(yǔ)與屬于本發(fā)明的技術(shù)領(lǐng)域的技術(shù)人員通常理解的含義相同。本文中在本發(fā)明的說明書中所使用的術(shù)語(yǔ)只是為了描述具體的實(shí)施例的目的,不是旨在于限制本發(fā)明。
本說明書中使用的“第一”、“第二”等包含序數(shù)的術(shù)語(yǔ)可用于說明各種構(gòu)成要素,但是這些構(gòu)成要素不受這些術(shù)語(yǔ)的限定。使用這些術(shù)語(yǔ)的目的僅在于將一個(gè)構(gòu)成要素區(qū)別于其他構(gòu)成要素。例如,在不脫離本發(fā)明的權(quán)利范圍的前提下,第一構(gòu)成要素可被命名為第二構(gòu)成要素,類似地,第二構(gòu)成要素也可以被命名為第一構(gòu)成要素。
為了更好的理解本發(fā)明的技術(shù)方案,下面將結(jié)合說明書附圖以及具體的實(shí)施方式對(duì)本發(fā)明的技術(shù)方案進(jìn)行詳細(xì)的說明,應(yīng)當(dāng)理解本發(fā)明實(shí)施例以及實(shí)施例中的具體特征是對(duì)本申請(qǐng)技術(shù)方案的詳細(xì)的說明,而不是對(duì)本申請(qǐng)技術(shù)方案的限定,在不沖突的情況下,本發(fā)明實(shí)施例以及實(shí)施例中的技術(shù)特征可以相互組合。
較佳實(shí)施例中的數(shù)據(jù)庫(kù)緩存控制方法包括:
s0、在緩存中創(chuàng)建以下映射表:查詢關(guān)鍵字與結(jié)果數(shù)據(jù)一對(duì)一的第一映射表、查詢語(yǔ)句和更新語(yǔ)句與表名一對(duì)多的第二映射表、表名與查詢關(guān)鍵字一對(duì)多的第三映射表;
其中,所述查詢關(guān)鍵字由查詢語(yǔ)句和查詢參數(shù)組合得到。
本發(fā)明中的映射表即為鍵值對(duì)數(shù)據(jù)結(jié)構(gòu),可以通過鍵快速取得值。鍵值對(duì)分為一對(duì)一和一對(duì)多兩種,其中一對(duì)一指的是一個(gè)鍵只能對(duì)應(yīng)一個(gè)值,后面保存的值會(huì)覆蓋之前的值;一對(duì)多則指的是一個(gè)鍵可以對(duì)應(yīng)多個(gè)值,后面保存的值不會(huì)覆蓋之前的值,而是同時(shí)存在,通過這個(gè)鍵可以獲取到它對(duì)應(yīng)的所有值。
s1、針對(duì)每次的數(shù)據(jù)查詢執(zhí)行步驟s2,針對(duì)每次的數(shù)據(jù)更新執(zhí)行步驟s3;
s2、查詢第一映射表,如第一映射表無查詢結(jié)果則查詢數(shù)據(jù)庫(kù),并基于數(shù)據(jù)庫(kù)查詢結(jié)果更新第一映射表以及基于查詢所涉及到的表名更新第二映射表和第三映射表;
s3、執(zhí)行數(shù)據(jù)庫(kù)更新后,基于更新所涉及到的表名更新第一映射表、第二映射表和第三映射表。
下面結(jié)合附圖1詳細(xì)說明所述步驟s2,參考圖1,步驟s2具體包括:
s21、利用查詢語(yǔ)句與查詢參數(shù)組合得到查詢關(guān)鍵字,基于該查詢關(guān)鍵字查詢緩存中的第一映射表,如果存在結(jié)果數(shù)據(jù)則返回該結(jié)果數(shù)據(jù)并結(jié)束本次查詢;如果不存在結(jié)果數(shù)據(jù),則執(zhí)行步驟s22;
s22、基于查詢語(yǔ)句與查詢參數(shù)查詢數(shù)據(jù)庫(kù),并把查詢關(guān)鍵字作為鍵、數(shù)據(jù)庫(kù)查詢結(jié)果作為值保存到第一映射表;
此處需要注意的是,即使數(shù)據(jù)庫(kù)查詢結(jié)果為空,也需要將查詢?yōu)榭兆鳛橐粋€(gè)查詢結(jié)果添加到第一映射表,這樣下次再次查詢相同的內(nèi)容時(shí),則直接通過查詢第一映射表即可獲取查詢結(jié)果,而無需再次查詢數(shù)據(jù)庫(kù)。
例如,如果數(shù)據(jù)庫(kù)查詢結(jié)果為空,可以在第一映射表中用db-null表示數(shù)據(jù)庫(kù)中不存在相應(yīng)的結(jié)果數(shù)據(jù)。而第一映射表中不存在具體的查詢關(guān)鍵字和結(jié)果數(shù)據(jù)時(shí)會(huì)用傳統(tǒng)的null表示。即如果查詢第一映射表返回null,則表示不存在結(jié)果數(shù)據(jù)需要查詢數(shù)據(jù)庫(kù),如果返回db-null則表示最終的結(jié)果數(shù)據(jù)為空。
s23、將查詢語(yǔ)句作為鍵從第二映射表查找查詢語(yǔ)句包含的所有表名,如果存在結(jié)果數(shù)據(jù)則跳到步驟s25,否則執(zhí)行步驟s24;
s24、基于sql語(yǔ)法規(guī)則解析查詢語(yǔ)句,并獲取查詢語(yǔ)句包含的所有表名,并將查詢語(yǔ)句作為鍵、查詢語(yǔ)句包含的所有表名作為值保存到第二映射表;
例如,查詢語(yǔ)句為select*fromtb-a,位于from后的tb-a即為表名。
s25、將查詢語(yǔ)句包含的所有表名均作為鍵、查詢關(guān)鍵字作為值保存至第三映射表。
下面結(jié)合附圖2詳細(xì)說明所述步驟s3,參考圖2,步驟s3具體包括:
s31、執(zhí)行數(shù)據(jù)庫(kù)更新操作;
s32、將更新語(yǔ)句作為鍵從第二映射表查找更新語(yǔ)句包含的所有表名,如果存在結(jié)果數(shù)據(jù),則跳轉(zhuǎn)至步驟s34,否則執(zhí)行步驟s33;
s33、基于sql語(yǔ)法規(guī)則解析更新語(yǔ)句,并獲取更新語(yǔ)句包含的所有表名,并將更新語(yǔ)句作為鍵、更新語(yǔ)句包含的所有表名作為值保存到第二映射表;
例如,deletefromm_namewherev=b,其中位于m_name即為表名。
其中,基于sql語(yǔ)法規(guī)則解析sql語(yǔ)句為本領(lǐng)域常識(shí),此處不再贅述。
s34、將更新語(yǔ)句包含的所有表名均作為鍵,從第三映射表查找所有的查詢關(guān)鍵字;
s35、從第一映射表中清除查找到的查詢關(guān)鍵字及其對(duì)應(yīng)的結(jié)果數(shù)據(jù);
s36、從第三映射表中清除更新語(yǔ)句包含的所有表名及其對(duì)應(yīng)的查詢關(guān)鍵字。
下面以結(jié)合具體的查詢實(shí)例和更新實(shí)例說明本發(fā)明。
1)、查詢實(shí)例
若執(zhí)行以下查詢語(yǔ)句:
select*fromuseru,companycwherename="?"andc.userid=u.id;
參數(shù)1為liudehua
則查詢關(guān)鍵字為:
select*fromuseru,companycwherename="?"andc.userid=u.id;liudehua
本查詢語(yǔ)句包含的表名為user和company兩個(gè)表。
如果定義:
sql0=select*fromuseru,companycwherename="?"andc.userid=u.id;
key0=select*fromuseru,companycwherename="?"andc.userid=u.id;liudehua
result0=本次查詢結(jié)果
則:
映射表1將增加如下數(shù)據(jù)
key0->result0
映射表2將增加如下數(shù)據(jù)
sql0->user,company
映射表3將增加如下數(shù)據(jù)
user->key0
company->key0
如此,在緩存沒有被清除的情況下,假如使用同樣的查詢語(yǔ)句和參數(shù)進(jìn)行再次查詢,則會(huì)從第一映射表1通過key0把result0直接找到,而無需再重復(fù)到數(shù)據(jù)庫(kù)查詢
2)、更新實(shí)例
若執(zhí)行以下更新語(yǔ)句:
updateusersetage=50wherename="?"
此語(yǔ)句包含了表user,則與user相關(guān)的數(shù)據(jù)將被清除
首先通過第三映射表查找到user->key0這條記錄(實(shí)際情況可能不止一條記錄),找到key0這個(gè)查詢關(guān)鍵字;
然后清除第一映射表下的以下記錄:key0->result0
最后清除第三映射表下的以下記錄:user->key0
同理,語(yǔ)句deletefromcompanywhereid="?"因?yàn)榘薱ompany表,也會(huì)刪除key0->result0這個(gè)緩存,但是語(yǔ)句deletefromorderwhereid="?"因?yàn)椴簧婕癱ompany表,則不會(huì)刪除key0->result0這個(gè)緩存。
基于同一發(fā)明構(gòu)思,本發(fā)明還公開了一種數(shù)據(jù)庫(kù)緩存控制系統(tǒng),包括:
初始化模塊,用于在緩存中創(chuàng)建以下映射表:查詢關(guān)鍵字與結(jié)果數(shù)據(jù)一對(duì)一的第一映射表、查詢語(yǔ)句和更新語(yǔ)句與表名一對(duì)多的第二映射表、表名與查詢關(guān)鍵字一對(duì)多的第三映射表;其中,所述查詢關(guān)鍵字由查詢語(yǔ)句和查詢參數(shù)組合得到;
查詢模塊,用于針對(duì)每次的數(shù)據(jù)查詢,查詢第一映射表,如第一映射表無查詢結(jié)果則查詢數(shù)據(jù)庫(kù),并基于數(shù)據(jù)庫(kù)查詢結(jié)果更新第一映射表以及基于查詢所涉及到的表名更新第二映射表和第三映射表;
更新模塊,用于針對(duì)每次的數(shù)據(jù)更新,執(zhí)行數(shù)據(jù)庫(kù)更新后,基于更新所涉及到的表名更新第一映射表、第二映射表和第三映射表。
具體的,所述查詢模塊包括:
第一映射表查詢子模塊,用于利用查詢語(yǔ)句與查詢參數(shù)組合得到查詢關(guān)鍵字,基于該查詢關(guān)鍵字查詢緩存中的第一映射表,如果存在結(jié)果數(shù)據(jù)則返回該結(jié)果數(shù)據(jù)并結(jié)束本次查詢;如果不存在結(jié)果數(shù)據(jù),則觸發(fā)數(shù)據(jù)庫(kù)查詢子模塊工作;
數(shù)據(jù)庫(kù)查詢子模塊,用于基于查詢語(yǔ)句與查詢參數(shù)查詢數(shù)據(jù)庫(kù),并將數(shù)據(jù)庫(kù)查詢結(jié)果發(fā)送至第一映射表更新子模塊一;
第一映射表更新子模塊一,用于把查詢關(guān)鍵字作為鍵、數(shù)據(jù)庫(kù)查詢結(jié)果作為值保存到第一映射表,并觸發(fā)第二映射表查詢子模塊一工作;
第二映射表查詢子模塊一,用于將查詢語(yǔ)句作為鍵從第二映射表查找查詢語(yǔ)句包含的所有表名,如果存在結(jié)果數(shù)據(jù)則觸發(fā)第三映射表更新子模塊工作,否則觸發(fā)語(yǔ)句解析及第二映射表更新子模塊一工作;
語(yǔ)句解析及第二映射表更新子模塊一,用于基于sql語(yǔ)法規(guī)則解析查詢語(yǔ)句,并獲取查詢語(yǔ)句包含的所有表名,并將查詢語(yǔ)句作為鍵、查詢語(yǔ)句包含的所有表名作為值保存到第二映射表,并觸發(fā)第三映射表更新子模塊一工作;
第三映射表更新子模塊一,用于將查詢語(yǔ)句包含的所有表名均作為鍵、查詢關(guān)鍵字作為值保存至第三映射表。
具體的,所述更新模塊包括:
數(shù)據(jù)庫(kù)更新子模塊,用于執(zhí)行數(shù)據(jù)庫(kù)更新操作,并觸發(fā)第二映射表查詢子模塊二工作;
第二映射表查詢子模塊二,用于將更新語(yǔ)句作為鍵從第二映射表查找更新語(yǔ)句包含的所有表名,如果存在結(jié)果數(shù)據(jù),則觸發(fā)第三映射表查詢子模塊工作,否則觸發(fā)語(yǔ)句解析及第二映射表更新子模塊二工作;
語(yǔ)句解析及第二映射表更新子模塊二,用于基于sql語(yǔ)法規(guī)則解析更新語(yǔ)句,并獲取更新語(yǔ)句包含的所有表名,并將更新語(yǔ)句作為鍵、更新語(yǔ)句包含的所有表名作為值保存到第二映射表,并觸發(fā)第三映射表查詢子模塊工作;
第三映射表查詢子模塊,用于將更新語(yǔ)句包含的所有表名均作為鍵,從第三映射表查找所有的查詢關(guān)鍵字,并觸發(fā)第一映射表更新子模塊二工作;
第一映射表更新子模塊二,用于從第一映射表中清除查找到的查詢關(guān)鍵字及其對(duì)應(yīng)的結(jié)果數(shù)據(jù),并觸發(fā)第三映射表更新子模塊二工作;
第三映射表更新子模塊二,用于從第三映射表中清除更新語(yǔ)句包含的所有表名及其對(duì)應(yīng)的查詢關(guān)鍵字。
綜上所述,實(shí)施本發(fā)明的數(shù)據(jù)庫(kù)緩存控制方法以及系統(tǒng),具有以下有益效果:本發(fā)明在緩存中利用三個(gè)映射表存儲(chǔ)查詢數(shù)據(jù),通過確定查詢語(yǔ)句和更新語(yǔ)句所包含的表名,根據(jù)表名來存儲(chǔ)或清除相關(guān)的緩存數(shù)據(jù),如此可以更精確地判斷查詢語(yǔ)句和更新語(yǔ)句之間的關(guān)系,每次執(zhí)行更新操作后只清空局部真正關(guān)聯(lián)的緩存,保留不關(guān)聯(lián)的緩存,而不是大范圍進(jìn)行清空,最終能夠顯著提高緩存命中率,提高數(shù)據(jù)訪問平均速度,提升用戶體驗(yàn),降低軟件開發(fā)難度,讓開發(fā)人員專注業(yè)務(wù)邏輯開發(fā),提高開發(fā)效率,降低軟件出錯(cuò)率,提升軟件質(zhì)量。
上面結(jié)合附圖對(duì)本發(fā)明的實(shí)施例進(jìn)行了描述,但是本發(fā)明并不局限于上述的具體實(shí)施方式,上述的具體實(shí)施方式僅僅是示意性的,而不是限制性的,本領(lǐng)域的普通技術(shù)人員在本發(fā)明的啟示下,在不脫離本發(fā)明宗旨和權(quán)利要求所保護(hù)的范圍情況下,還可做出很多形式,這些均屬于本發(fā)明的保護(hù)之內(nèi)。