本申請涉及信息技術(shù)領(lǐng)域,尤其涉及一種數(shù)據(jù)庫語句編譯和執(zhí)行方法及裝置。
背景技術(shù):
隨著信息化社會的發(fā)展,人們越來越依賴于數(shù)據(jù)庫進(jìn)行大量數(shù)據(jù)的存儲,而數(shù)據(jù)庫技術(shù)也成為大數(shù)據(jù)時(shí)代的基石,成為一直以來人們關(guān)注的重點(diǎn)。
其中,在關(guān)系型數(shù)據(jù)庫中,一般采用結(jié)構(gòu)化查詢語言(structuredquerylanguage,sql)存取數(shù)據(jù)以及查詢、更新和管理關(guān)系數(shù)據(jù)庫系統(tǒng)。一般情況下,數(shù)據(jù)庫管理系統(tǒng)(databasemanagementsystem,dbms)在接收到一個sql語句時(shí),需要先進(jìn)行一個編譯過程:解析該sql語句、檢查該sql語句的語法和語義以及該sql語句的生成代碼,而通常該編譯過程所需的時(shí)間要比dbms執(zhí)行該sql語句所需要的時(shí)間長。
然而,當(dāng)一個sql語句反復(fù)出現(xiàn)時(shí)(如,sql語句出現(xiàn)在for或者while循環(huán)中時(shí)),該dbms需要反復(fù)編譯該sql語句并執(zhí)行該sql語句,從而導(dǎo)致數(shù)據(jù)庫系統(tǒng)的整體效率降低。于是,在現(xiàn)有技術(shù)中,人們采用對sql語句進(jìn)行預(yù)編譯的方法。解決這一問題。
具體的,在創(chuàng)建java編程語言的應(yīng)用程序接口preparedstatement(其中,preparedstatement是java.sql中的一個接口,它是statement的子接口)對象時(shí)(preparedstatement對象是用于訪問和處理存儲在數(shù)據(jù)庫中數(shù)據(jù)的),將指定需要預(yù)編譯的sql語句發(fā)送給dbms進(jìn)行解析、檢查、編譯等預(yù)編譯過程,并將該預(yù)編譯后的sql語句存儲在本地(具體可存儲在本地內(nèi)存中,該本地內(nèi)存稱為:數(shù)據(jù)庫緩沖池)。當(dāng)dbms接收到待執(zhí)行的sql語句后,該dbms 可以通過從本地內(nèi)存保存的若干已預(yù)編譯的sql語句中,判斷該待執(zhí)行的sql語句是否已經(jīng)經(jīng)過預(yù)編譯,若是,則無需再次進(jìn)行編譯,可直接執(zhí)行本地保存的對應(yīng)的預(yù)編譯sql語句,若不是,則可對該待執(zhí)行的sql語句進(jìn)行預(yù)編譯后,并將預(yù)編譯后的sql語句同樣存儲在本地,再執(zhí)行該預(yù)編譯后的sql語句。
通過上述預(yù)編譯過程可見,即使一個sql語句反復(fù)出現(xiàn),dbms也無需重復(fù)執(zhí)行編譯的過程,可直接在本地查找并執(zhí)行預(yù)編譯后的sql語句,解決了重復(fù)編譯sql語句帶來的數(shù)據(jù)庫系統(tǒng)效率降低的問題。
更進(jìn)一步的,除了在服務(wù)器端進(jìn)行sql語言的預(yù)編譯,在終端也可以進(jìn)行sql語句預(yù)編譯,具體是通過java數(shù)據(jù)庫連接(javadatabaseconnectivity,jdbc)驅(qū)動完成的。但是,在jdbc驅(qū)動中進(jìn)行終端sql語句預(yù)編譯時(shí),jdbc驅(qū)動無法識別針對不同分表但結(jié)構(gòu)相同的多個sql語句,這就導(dǎo)致若這些sql語句需要訪問的是將大數(shù)據(jù)表進(jìn)行水平拆分后的若干分表時(shí),雖然每個分表的結(jié)構(gòu)完全一致,但由于每個分表的標(biāo)識不一致,因此jdbc驅(qū)動仍會對這些sql語句分別進(jìn)行預(yù)編譯。這不僅導(dǎo)致jbdc驅(qū)動進(jìn)行重復(fù)的sql語句預(yù)編譯,影響sql語句的執(zhí)行效率,同時(shí)也會占用大量的內(nèi)存,進(jìn)而影響終端整體運(yùn)行效率。
例如,假設(shè),某關(guān)系型數(shù)據(jù)庫中的一張總表標(biāo)識為vcc_coucher,并針對該總表存在一條sql語句,如,select*fromvcc_coucherwhereuser_id=“?”,那么此時(shí)jdbc驅(qū)動只需對這一條sql語句進(jìn)行預(yù)編譯即可。進(jìn)一步假設(shè),當(dāng)該總表被拆分成100個分表,并且各分表標(biāo)識分別為vcc_coucher_00、vcc_coucher_01、vcc_coucher_02……vcc_coucher_99,那么針對同一條sql語句,由于各分表標(biāo)識均不同,而jdbc驅(qū)動無法識別結(jié)構(gòu)相同的sql語句,所以jdbc驅(qū)動需要分別對100條sql語句進(jìn)行預(yù)編譯,如表1所示。
表1
通過表1可見,jdbc驅(qū)動針對多個sql語句,如果這些sql語句訪問的是出自同一大數(shù)據(jù)表的不同分表,那么這些sql語句實(shí)際上的結(jié)構(gòu)都是一致的,僅僅是數(shù)據(jù)表標(biāo)識不一致。而jdbc驅(qū)動需要重復(fù)的預(yù)編譯這些sql語句,增大了終端預(yù)編譯sql語句的壓力、同時(shí)也增加了終端的內(nèi)存壓力。
可見現(xiàn)有技術(shù)中,在終端進(jìn)行sql語句預(yù)編譯的方法,可導(dǎo)致終端內(nèi)存中存儲大量的預(yù)編譯sql語句,不僅導(dǎo)致內(nèi)存使用率高,同時(shí)也影響了sql語句的執(zhí)行效率。
技術(shù)實(shí)現(xiàn)要素:
本申請實(shí)施例提供一種數(shù)據(jù)庫語句編譯和訪問方法及裝置,用以解決現(xiàn)有數(shù)據(jù)庫語句編譯和訪問方法,對文檔集或語料集進(jìn)行分析確定的主題可理解性低,導(dǎo)致需要重復(fù)分析文檔,影響文檔分析效率的問題。
本申請實(shí)施例提供的一種數(shù)據(jù)庫語句編譯方法,包括:
接收攜帶數(shù)據(jù)庫訪問語句的預(yù)編譯請求,其中所述數(shù)據(jù)庫訪問語句中包含數(shù)據(jù)表標(biāo)識;
當(dāng)所述數(shù)據(jù)表標(biāo)識為分表標(biāo)識時(shí),根據(jù)預(yù)先保存的分表標(biāo)識與總表標(biāo)識的對應(yīng)關(guān)系,將所述數(shù)據(jù)庫訪問語句中的分表標(biāo)識替換為對應(yīng)的總表標(biāo)識;
對替換后的數(shù)據(jù)訪問語句進(jìn)行預(yù)編譯。
本申請實(shí)施例提供的一種數(shù)據(jù)庫語句執(zhí)行方法,包括:
接收待執(zhí)行數(shù)據(jù)庫訪問語句;
確定所述待執(zhí)行數(shù)據(jù)庫訪問語句對應(yīng)的預(yù)編譯數(shù)據(jù)庫訪問語句;
判斷是否存在對應(yīng)所述待執(zhí)行數(shù)據(jù)庫訪問語句的替換關(guān)系;
若不存在,則執(zhí)行所述預(yù)編譯數(shù)據(jù)庫訪問語句;
若存在,則根據(jù)預(yù)先記錄的所述待執(zhí)行數(shù)據(jù)庫訪問語句對應(yīng)的替換關(guān)系,將所述待執(zhí)行數(shù)據(jù)庫訪問語句對應(yīng)的預(yù)編譯數(shù)據(jù)訪問語句中的總表標(biāo)識替換為對應(yīng)的分表標(biāo)識,再執(zhí)行替換后的預(yù)編譯數(shù)據(jù)庫訪問語句。
本申請實(shí)施例提供的一種數(shù)據(jù)庫語句編譯裝置,包括:
接收模塊,用于接收攜帶數(shù)據(jù)庫訪問語句的預(yù)編譯請求,其中所述數(shù)據(jù)庫訪問語句中包含數(shù)據(jù)表標(biāo)識;
替換模塊,用于當(dāng)所述數(shù)據(jù)表標(biāo)識為分表標(biāo)識時(shí),根據(jù)預(yù)先保存的分表標(biāo)識與總表標(biāo)識的對應(yīng)關(guān)系,將所述數(shù)據(jù)庫訪問語句中的分表標(biāo)識替換為對應(yīng)的總表標(biāo)識;
編譯模塊,用于對替換后的數(shù)據(jù)訪問語句進(jìn)行預(yù)編譯。
本申請實(shí)施例提供的一種數(shù)據(jù)庫語句執(zhí)行裝置,包括:
接收模塊,用于接收待執(zhí)行數(shù)據(jù)庫訪問語句;
確定模塊,用于確定所述待執(zhí)行數(shù)據(jù)庫訪問語句對應(yīng)的預(yù)編譯數(shù)據(jù)庫訪問語句;
判斷執(zhí)行模塊,用于判斷是否存在對應(yīng)所述待執(zhí)行數(shù)據(jù)庫訪問語句的替換關(guān)系,若不存在,則執(zhí)行所述預(yù)編譯數(shù)據(jù)庫訪問語句,若存在,則根據(jù)預(yù)先記錄的所述待執(zhí)行數(shù)據(jù)庫訪問語句對應(yīng)的替換關(guān)系,將所述待執(zhí)行數(shù)據(jù)庫訪問語句對應(yīng)的預(yù)編譯數(shù)據(jù)訪問語句中的總表標(biāo)識替換為對應(yīng)的分表標(biāo)識,再執(zhí)行替換后的預(yù)編譯數(shù)據(jù)庫訪問語句。
本申請實(shí)施例提供一種數(shù)據(jù)庫語句編譯和執(zhí)行方法及裝置,該方法當(dāng)接收的預(yù)編譯請求中數(shù)據(jù)庫語句包含的數(shù)據(jù)表標(biāo)識為分表標(biāo)識時(shí),根據(jù)預(yù)先保存的分表標(biāo)識與總表標(biāo)識的對應(yīng)關(guān)系,將該數(shù)據(jù)庫語句中的分表標(biāo)識替換為總表標(biāo)識,并進(jìn)行預(yù)編譯。當(dāng)接收到待執(zhí)行數(shù)據(jù)庫訪問語句時(shí),先判斷該待執(zhí)行數(shù)據(jù)庫訪問語句是否存在對應(yīng)的預(yù)編譯數(shù)據(jù)庫訪問語句,若否,則對該待執(zhí)行數(shù)據(jù)庫訪問語句進(jìn)行預(yù)編譯后再執(zhí)行,若是,則根據(jù)預(yù)先記錄的該待執(zhí)行數(shù)據(jù)庫訪 問語句對應(yīng)的替換關(guān)系,將該待執(zhí)行數(shù)據(jù)庫訪問語句對應(yīng)的預(yù)編譯數(shù)據(jù)訪問語句中的總表標(biāo)識替換為對應(yīng)的分表標(biāo)識,再執(zhí)行替換后的預(yù)編譯數(shù)據(jù)庫訪問語句。通過上述方法,統(tǒng)一針對分表標(biāo)識的數(shù)據(jù)庫語句的預(yù)編譯過程,使得在數(shù)據(jù)庫語句編譯和執(zhí)行過程中,終端耗費(fèi)的資源更少,效率更高。
附圖說明
此處所說明的附圖用來提供對本申請的進(jìn)一步理解,構(gòu)成本申請的一部分,本申請的示意性實(shí)施例及其說明用于解釋本申請,并不構(gòu)成對本申請的不當(dāng)限定。在附圖中:
圖1為本申請實(shí)施例提供的數(shù)據(jù)庫語句編譯過程;
圖2是本申請實(shí)施例提供一種數(shù)據(jù)庫語句執(zhí)過程;
圖3是本申請實(shí)施例提供一種數(shù)據(jù)庫語句編譯裝置的結(jié)構(gòu)示意圖;
圖4是本申請實(shí)施例提供一種數(shù)據(jù)庫語句執(zhí)行裝置的結(jié)構(gòu)示意圖。
具體實(shí)施方式
在本申請實(shí)施例中,對數(shù)據(jù)庫語句的編譯過程為:接收攜帶數(shù)據(jù)庫訪問語句的預(yù)編譯請求,當(dāng)該數(shù)據(jù)庫訪問語句中包含的數(shù)據(jù)表標(biāo)識為分表標(biāo)識時(shí),根據(jù)預(yù)先保存的分表標(biāo)識與總表標(biāo)識的對應(yīng)關(guān)系,將該數(shù)據(jù)庫訪問語句中的分表標(biāo)識替換為總表標(biāo)識,最后對替換后的數(shù)據(jù)庫訪問語句進(jìn)行預(yù)編譯。對應(yīng)的對數(shù)據(jù)庫語句的執(zhí)行過程為:接收待執(zhí)行數(shù)據(jù)庫訪問語句,先判斷該待執(zhí)行數(shù)據(jù)庫訪問語句是否存在對應(yīng)的預(yù)編譯數(shù)據(jù)庫訪問語句,若否,則對該待執(zhí)行數(shù)據(jù)庫訪問語句進(jìn)行預(yù)編譯后再執(zhí)行,若是,則根據(jù)預(yù)先記錄的該待執(zhí)行數(shù)據(jù)庫訪問語句對應(yīng)的替換關(guān)系,將該待執(zhí)行數(shù)據(jù)庫訪問語句對應(yīng)的預(yù)編譯數(shù)據(jù)訪問語句中的總表標(biāo)識替換為對應(yīng)的分表標(biāo)識,再執(zhí)行替換后的預(yù)編譯數(shù)據(jù)庫訪問語句??梢姳旧暾埶龅姆椒?,在進(jìn)行數(shù)據(jù)庫訪問語句的預(yù)編譯時(shí),當(dāng)該數(shù)據(jù)庫訪問語句中數(shù)據(jù)表標(biāo)識是分表標(biāo)識時(shí),針對每個分表的結(jié)構(gòu)相同的數(shù)據(jù)庫訪問 語句,只需一次預(yù)編譯即可,無需重復(fù)進(jìn)行編譯。并且,在執(zhí)行對應(yīng)各分表的待執(zhí)行數(shù)據(jù)庫訪問語句時(shí),可以根據(jù)對應(yīng)的替換關(guān)系,將預(yù)編譯數(shù)據(jù)庫語句中的總表標(biāo)識替換為對應(yīng)的分表標(biāo)識,并執(zhí)行??梢姡谑褂帽旧暾埖姆椒ㄟM(jìn)行數(shù)據(jù)庫語句編譯和執(zhí)行時(shí),既達(dá)到了預(yù)編譯數(shù)據(jù)庫語句可以提高數(shù)據(jù)庫語句執(zhí)行效率的效果,同時(shí)也避免了現(xiàn)有技術(shù)中重復(fù)預(yù)編譯的缺點(diǎn),降低了對預(yù)編譯數(shù)據(jù)庫語句的存儲壓力,提高了數(shù)據(jù)庫語言的執(zhí)行效率。
為使本申請的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合本申請具體實(shí)施例及相應(yīng)的附圖對本申請技術(shù)方案進(jìn)行清楚、完整地描述。顯然,所描述的實(shí)施例僅是本申請一部分實(shí)施例,而不是全部的實(shí)施例?;诒旧暾堉械膶?shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實(shí)施例,都屬于本申請保護(hù)的范圍。
圖1為本申請實(shí)施例提供的數(shù)據(jù)庫語句編譯過程,具體包括以下步驟:
s101:接收攜帶數(shù)據(jù)庫訪問語句的預(yù)編譯請求。
在本申請實(shí)施例中,終端接收線程發(fā)送的數(shù)據(jù)庫訪問語句的預(yù)編譯請求,其中,該終端可以是個人電腦(personalcomputer,pc)、手機(jī)、平板電腦等,該數(shù)據(jù)訪問語句可以是sql語句,也可以是其他數(shù)據(jù)庫等,該sql語句訪問的數(shù)據(jù)庫可以是關(guān)系型數(shù)據(jù)庫(即,分布式數(shù)據(jù)庫),下面僅以對關(guān)系型數(shù)據(jù)庫訪問語句為sql語句進(jìn)行說明。
具體的,由于在終端中一般通過jdbc驅(qū)動進(jìn)行數(shù)據(jù)庫語句的預(yù)編譯,所以在本申請中,該終端中的jdbc驅(qū)動接收線程發(fā)送的攜帶sql語句的預(yù)編譯請求。并且,因?yàn)樵搒ql語句為數(shù)據(jù)庫訪問語句,所以根據(jù)sql語句的格式要求,該sql語句中可包含需要訪問的數(shù)據(jù)表的標(biāo)識,即,數(shù)據(jù)表標(biāo)識。
需要說明的是,由于jdbc驅(qū)動通常應(yīng)用在終端中進(jìn)行數(shù)據(jù)庫語句的預(yù)編譯,所以本申請針對的是采用jdbc驅(qū)動進(jìn)行數(shù)據(jù)庫語言預(yù)編譯的方法,并不局限于終端中,當(dāng)然,由于在服務(wù)器端一般由dbms進(jìn)行數(shù)據(jù)庫語言預(yù)編譯,所以在一般場景下,本申請適用在終端中,以下僅以終端為例進(jìn)行說明。
例如,假設(shè)工作人員想要通過pc查詢公司分布式數(shù)據(jù)庫中用戶名為“官方”的用戶,并且在該數(shù)據(jù)庫中用于存儲用戶名的大數(shù)據(jù)表已拆分為100個分表,即,存儲全部用戶名的總表已經(jīng)拆分為對應(yīng)的100個分表。則工作人員在通過sql語句查詢該數(shù)據(jù)庫中符合條件的用戶名時(shí),該pc的jdbc驅(qū)動會接收到線程a發(fā)送的100個對sql語句進(jìn)行預(yù)編譯的請求,并且每個sql語句中包含不同的分表標(biāo)識,進(jìn)一步假設(shè),該總表標(biāo)識為vcc_coucher,拆分出的各分表標(biāo)識分別為vcc_coucher_00、vcc_coucher_01、vcc_coucher_02……vcc_coucher_99。那么針對第一個分表(即,分表標(biāo)識為vcc_coucher_00的分表),jdbc驅(qū)動會接收到攜帶sql語句為select*fromvcc_coucher_00whereuser_id=‘官方’的預(yù)編譯請求,其中數(shù)據(jù)表標(biāo)識為分表標(biāo)識:vcc_coucher_00。
s102:當(dāng)所述數(shù)據(jù)表標(biāo)識為分表標(biāo)識時(shí),根據(jù)預(yù)先保存的分表標(biāo)識與總表標(biāo)識的對應(yīng)關(guān)系,將所述數(shù)據(jù)庫訪問語句中的分表標(biāo)識替換為對應(yīng)的總表標(biāo)識。
由于jdbc驅(qū)動的重復(fù)預(yù)編譯行為,是因?yàn)閖dbc驅(qū)動無法識別針對不同分表但結(jié)構(gòu)相同的多個sql語句,所以在本申請實(shí)施例中,當(dāng)在步驟s101中接收到的sql語句中的數(shù)據(jù)表標(biāo)識為分表標(biāo)識時(shí),才需要使用本申請?zhí)峁┑姆椒ā?/p>
具體的,由于在數(shù)據(jù)庫將大數(shù)據(jù)表拆分為分表時(shí),通常會有相應(yīng)的對分表進(jìn)行命名的規(guī)則,可對總表標(biāo)識與分表標(biāo)識的對應(yīng)關(guān)系進(jìn)行記錄,所以當(dāng)該終端需要訪問該數(shù)據(jù)庫時(shí),可預(yù)先將該數(shù)據(jù)庫中各總表標(biāo)識與各分表標(biāo)識的對應(yīng)關(guān)系保存,以便后續(xù)訪問該數(shù)據(jù)庫。
于是,首先,該jdbc驅(qū)動可以根據(jù)預(yù)先保存的各總表標(biāo)識與各分表標(biāo)識的對應(yīng)關(guān)系,判斷該sql語句中包含的數(shù)據(jù)表標(biāo)識是否為分表標(biāo)識,若否,則無需進(jìn)行后續(xù)的替換步驟,可以直接針對該sql語句進(jìn)行預(yù)編譯,若是,則可進(jìn)行后續(xù)步驟。
其次,當(dāng)確定該sql語句中包含的數(shù)據(jù)表標(biāo)識為分表標(biāo)識時(shí),可根據(jù)預(yù) 先保存的各分表標(biāo)識與各總表標(biāo)識的對應(yīng)關(guān)系,確定與該分表標(biāo)識對應(yīng)的總表標(biāo)識。
最后,則可將該sql語句中的分表標(biāo)識替換為對應(yīng)的總表標(biāo)識。
并且,由于此時(shí)sql語句中的數(shù)據(jù)表標(biāo)識已經(jīng)替換為總表標(biāo)識,所以為了方便后續(xù)執(zhí)行sql語句時(shí),可以針對不同的sql語句分別還原對應(yīng)的分表標(biāo)識,則此時(shí),還可以記錄該sql語句中的分表標(biāo)識與對應(yīng)的總表標(biāo)識之間的替換關(guān)系,以便在執(zhí)行預(yù)編譯后的sql語句時(shí),可根據(jù)記錄的該替換關(guān)系,將該預(yù)編譯后的sql語句中的總表標(biāo)識替換為對應(yīng)的分表標(biāo)識,再執(zhí)行。具體的,該替換關(guān)系可以記錄在發(fā)送該預(yù)編譯請求線程的線程變量中。
需要說明的是,該替換關(guān)系也可直接記錄在該終端本地,具體記錄在何處本申請并不做具體限定。
繼續(xù)沿用上例,由于該jdbc驅(qū)動接收到攜帶sql語句為select*fromvcc_coucher_00whereuser_id=‘官方’的預(yù)編譯請求,而通過預(yù)先保存的分表標(biāo)識與總表標(biāo)識的對應(yīng)規(guī)則,可以判斷該sql語句中的數(shù)據(jù)表標(biāo)識為分表標(biāo)識。其中,假設(shè)分表標(biāo)識與總表標(biāo)識的對應(yīng)關(guān)系如表2所示。
表2
通過表2可見,該數(shù)據(jù)表標(biāo)識vcc_coucher_00為分表標(biāo)識,并且該本表標(biāo)識對應(yīng)的總表標(biāo)識為vcc_coucher,所以可將該sql語句“select*fromvcc_coucher_00whereuser_id=“官方”中的分表標(biāo)識vcc_coucher_00替換為總表標(biāo)識vcc_coucher,則此時(shí)替換后的sql語句為select*fromvcc_coucherwhereuser_id=‘官方’。
并且,該jdbc驅(qū)動還可將針對該sql語句的“分表標(biāo)識vcc_coucher_00替換為總表標(biāo)識vcc_coucher”的替換關(guān)系,記錄在該線程a的線程變量中。
s103:對替換后的數(shù)據(jù)訪問語句進(jìn)行預(yù)編譯。
在本申請實(shí)施例中,當(dāng)對sql語句中的數(shù)據(jù)表標(biāo)識已經(jīng)被替換后,jdbc驅(qū)動便可對該替換后的sql語句進(jìn)行與現(xiàn)有技術(shù)中相同的預(yù)編譯過程。
具體的預(yù)編譯過程與現(xiàn)有技術(shù)一致,即,當(dāng)jdbc驅(qū)動對該替換后的sql語句進(jìn)行預(yù)編譯時(shí),可先根據(jù)保存在本地的各預(yù)編譯sql語句,判斷該替換后的sql語句是否已經(jīng)經(jīng)過預(yù)編譯(即,判斷本地是否保存有與該替換后的sql語句一致的預(yù)編譯sql語句),若是,則可確定該替換后的sql語句已經(jīng)經(jīng)過預(yù)編譯可以無需再編譯,若否,可確定需要對該替換后的sql語句進(jìn)行預(yù)編譯,則此時(shí),該jdbc驅(qū)動可對需要進(jìn)行預(yù)編譯的該替換后的sql語句進(jìn)行解析、檢查、編譯等預(yù)編譯過程,并得到與該替換后的sql語句對應(yīng)的預(yù)編譯sql語句,并將該預(yù)編譯后的sql語句存儲在本地(如,終端的內(nèi)存中),以便后續(xù)在執(zhí)行sql語句時(shí),可以直接調(diào)用存儲在本地對應(yīng)的預(yù)編譯sql語句,并執(zhí)行,達(dá)到使sql語句的執(zhí)行效率提高的目的。
繼續(xù)沿用上例,該pc中的jdbc驅(qū)動,根據(jù)本地保存的各預(yù)編譯后的sql語句,判斷確定本地并沒有保存與該替換后的sql語句一致的預(yù)編譯sql語句,于是確定需要對該替換后的sql語句進(jìn)行預(yù)編譯,進(jìn)一步便可將替換后 的sql語句(具體為:select*fromvcc_coucherwhereuser_id=‘官方’)進(jìn)行預(yù)編譯過程,并將預(yù)編譯后的該sql語句存儲在該pc的內(nèi)存中。
進(jìn)一步假設(shè),由于該工作人員是希望對所有用戶名都進(jìn)行查詢,而該用于存儲用戶名的大數(shù)據(jù)表已拆分為100個分表,所以該線程a還存在針對不同分表標(biāo)識的sql語句的預(yù)編譯請求(如,select*fromvcc_coucher_01whereuser_id=‘官方’、select*fromvcc_coucher_02whereuser_id=‘官方’……select*fromvcc_coucher_99whereuser_id=‘官方’等等),則此時(shí)該pc中的jdbc驅(qū)動在經(jīng)過上述步驟s101和s102之后,會將上述各sql語句替換為同一個sql語句:select*fromvcc_coucherwhereuser_id=‘官方’,并將對應(yīng)的替換關(guān)系記錄在該線程a的線程變量中,所以在預(yù)編譯該替換后的sql語句之前,該jdbc驅(qū)動都會判斷該sql語句已經(jīng)經(jīng)過預(yù)編譯處理,無需再次進(jìn)行預(yù)編譯,減輕了該jdbc驅(qū)動的運(yùn)行壓力,以及該pc的存儲壓力。
通過如圖1所示的數(shù)據(jù)庫訪問語句編譯方法,可見,對數(shù)據(jù)庫訪問語句進(jìn)行預(yù)編譯之前,先判斷該數(shù)據(jù)庫訪問語句中的數(shù)據(jù)表標(biāo)識是否為分表標(biāo)識,當(dāng)該數(shù)據(jù)表標(biāo)識為分表標(biāo)識,跟據(jù)預(yù)先保存的分表標(biāo)識與總表標(biāo)識的對應(yīng)關(guān)系,將該數(shù)據(jù)庫訪問語句中的分表標(biāo)識替換為總表標(biāo)識,最后再對該替換后的數(shù)據(jù)庫訪問語句進(jìn)行預(yù)編譯,可見針對同一個總表下不同分表的相同語句結(jié)構(gòu)的數(shù)據(jù)庫訪問語句,由于步驟s102的替換過程,使得需要經(jīng)行預(yù)編譯的語句可以統(tǒng)一為一個,即,避免了對數(shù)據(jù)庫訪問語句的重復(fù)預(yù)編譯,在保證預(yù)編譯數(shù)據(jù)庫訪問語句帶來的優(yōu)點(diǎn)的同時(shí),提高了jdbc驅(qū)動的運(yùn)行效率,減輕了終端的存儲壓力。
另外,在圖1所述的數(shù)據(jù)庫語句編譯過程中,僅僅以一個線程為例進(jìn)行了說明,但是,本方法并不限定單個線程的預(yù)編譯請求,可以是針對多個線程的預(yù)編譯請求。由于對于相同結(jié)構(gòu)的sql語句,通過步驟s102均可替換為相同的sql語句,所以針對每個具有相同結(jié)構(gòu)的sql語句的預(yù)編譯請求,無論該預(yù)編譯請求是不是由同一個線程發(fā)出的,對于jdbc驅(qū)動來說,均只需要進(jìn)行 一次預(yù)編譯即可。
繼續(xù)沿用上例,假設(shè)線程a、線程b、線程c,分別向jdbc驅(qū)動發(fā)送了相同結(jié)構(gòu)sql語句的預(yù)編譯請求,其中,線程a中的sql語句為select*fromvcc_coucher_01whereuser_id=‘官方’、線程b中的sql語句為select*fromvcc_coucher_02whereuser_id=‘官方’、線程c中的sql語句為select*fromvcc_coucher_03whereuser_id=‘官方’。
進(jìn)一步假設(shè),該jdbc驅(qū)動最先接收到線程b的預(yù)編譯請求,則在經(jīng)過步驟s102~步驟s103之后,該jdbc驅(qū)動會將替換后的sql語句select*fromvcc_coucherwhereuser_id=‘官方’進(jìn)行預(yù)編譯,該線程b僅在線程變量中保存了分表標(biāo)識vcc_coucher_02替換為總表標(biāo)識vcc_coucher的替換關(guān)系。而當(dāng),后續(xù)該jdbc驅(qū)動接收到線程a、或者線程c的預(yù)編譯請求時(shí),由于經(jīng)過步驟s102,該sql語句均會被替換為select*fromvcc_coucherwhereuser_id=‘官方’,而由于該替換后的sql語句已經(jīng)在執(zhí)行線程b的預(yù)編譯請求過程中進(jìn)行過預(yù)編譯,所以該jdbc驅(qū)動無需再次執(zhí)行預(yù)編譯,該線程a和線程c也僅需在分別在各自的線程變量中記錄對應(yīng)的替換關(guān)系即可。
基于圖1所示的數(shù)據(jù)庫訪問語句編譯過程,本申請實(shí)施例還對應(yīng)提供一種數(shù)據(jù)庫語句執(zhí)過程,如圖2所示。
圖2是本申請實(shí)施例提供一種數(shù)據(jù)庫語句執(zhí)過程,具體包括以下步驟:
s201:接收待執(zhí)行數(shù)據(jù)庫訪問語句。
一般終端通過jdbc驅(qū)動來執(zhí)行各線程發(fā)送的數(shù)據(jù)庫訪問語句,于是,在本申請實(shí)施例中,終端中的jdbc驅(qū)動可接收待執(zhí)行的數(shù)據(jù)庫訪問語句,其中,該終端可以是個人電腦(personalcomputer,pc)、手機(jī)、平板電腦等,該數(shù)據(jù)訪問語句可以是sql語句,也可以是其他數(shù)據(jù)庫等,該sql語句訪問的數(shù)據(jù)庫可以是關(guān)系型數(shù)據(jù)庫(即,分布式數(shù)據(jù)庫),下面僅以該終端接收待執(zhí)行sql語句進(jìn)行說明。
繼續(xù)沿用上例,假設(shè)該工作人員的pc中的jdbc驅(qū)動接收到了線程a發(fā) 送的待執(zhí)行sql語句:select*fromvcc_coucher_00whereuser_id=‘官方’。
s202:判斷所述待執(zhí)行數(shù)據(jù)庫訪問語句是否存在對應(yīng)的預(yù)編譯數(shù)據(jù)庫訪問語句,若不存在,則執(zhí)行步驟s203,若存在,則執(zhí)行步驟s204。
在本申請實(shí)施例中,由于存在對sql語句的預(yù)編譯過程,所以jdbc驅(qū)動在接收到每個待執(zhí)行sql語句時(shí),都需要保存在本地的各預(yù)編譯sql語句,判斷該待執(zhí)行sql語句是否存在對應(yīng)的預(yù)編譯sql語句,以便后續(xù)操作。
具體的,由于在步驟s102~s103中已經(jīng)將預(yù)編譯的sql語句中各分表標(biāo)識替換為總表標(biāo)識,而jdbc驅(qū)動在步驟s201中接收到的還是包含分表標(biāo)識的待執(zhí)行sql語句,所以判斷該待執(zhí)行sql語句是否存在預(yù)編譯sql語句的過程需要分為兩步。
首先,jdbc驅(qū)動可根據(jù)發(fā)送該待執(zhí)行sql語句的線程中線程變量,確定該待發(fā)送sql語句是否存在替換關(guān)系,若存在,則可以進(jìn)行后續(xù)判斷,若不存在,則可直接執(zhí)行步驟s203。
其次,根據(jù)該替換關(guān)系中的總表標(biāo)識,判斷是否存在對應(yīng)該總表標(biāo)識的預(yù)編譯sql語句,若是,則執(zhí)行步驟s204,若否則執(zhí)行步驟s203。具體的,該jdbc驅(qū)動可以調(diào)用本地保存的各預(yù)編譯sql語句,根據(jù)各預(yù)編譯sql語句,查找是否存在既包含該總表標(biāo)識又與該待執(zhí)行sql語句結(jié)構(gòu)相同的預(yù)編譯sql語句,若存在則執(zhí)行步驟s204,若不存在則執(zhí)行步驟s203。
繼續(xù)沿用上例,假設(shè)jdbc驅(qū)動跟據(jù)該線程a中的線程變量,確定該待執(zhí)行sql語句中存在替換關(guān)系,先確定該替換關(guān)系為將分表標(biāo)識vcc_coucher_00替換為總表標(biāo)識vcc_coucher,那么就可以根據(jù)其中的總表標(biāo)識vcc_coucher以及該地執(zhí)行sql語句的結(jié)構(gòu)select*from數(shù)據(jù)表標(biāo)識whereuser_id=‘官方’,查找本地保存的各預(yù)編譯sql語句中是否存在既包含總表標(biāo)識vcc_coucher、sql語句結(jié)構(gòu)又為select*from數(shù)據(jù)表標(biāo)識whereuser_id=‘官方’的預(yù)編譯sql語句。
進(jìn)一步假設(shè),該jdbc驅(qū)動,找到了預(yù)編譯sql語句select*from vcc_coucherwhereuser_id=‘官方’,其中包含總表標(biāo)識vcc_coucher,其語句結(jié)構(gòu)也為elect*from數(shù)據(jù)表標(biāo)識whereuser_id=‘官方’,則判斷存在與該待執(zhí)行sql語句對應(yīng)的預(yù)編譯sql語句,需要執(zhí)行步驟s204。
s203:對所述待執(zhí)行數(shù)據(jù)庫訪問語句進(jìn)行預(yù)編譯后,執(zhí)行預(yù)編譯后的數(shù)據(jù)庫訪問語句。
在本申請實(shí)施例中,若該待執(zhí)行sql語句沒有對應(yīng)的預(yù)編譯sql語句,那么除了直接對該待執(zhí)行sql語句進(jìn)行編譯并執(zhí)行以外,在本申請中,還以將該待執(zhí)行sql語句的編譯結(jié)果,作為預(yù)編譯sql語句進(jìn)行保存,并執(zhí)行預(yù)編譯后的sql語句,以便后續(xù)再次執(zhí)行該待執(zhí)行sql語句時(shí),可直接調(diào)用對應(yīng)的預(yù)編譯sql語句并執(zhí)行。
繼續(xù)沿用上例,假設(shè),在步驟s202中,判斷該待執(zhí)行sql語句不存在對應(yīng)的預(yù)編譯sql語句,則,該jdbc驅(qū)動在對該待執(zhí)行sql語句進(jìn)行編譯后,將已編譯的該待執(zhí)行sql語句,作為預(yù)編譯sql語句存儲,并執(zhí)行該預(yù)編譯sql語句。
s204:根據(jù)預(yù)先記錄的所述待執(zhí)行數(shù)據(jù)庫訪問語句對應(yīng)的替換關(guān)系,將所述待執(zhí)行數(shù)據(jù)庫訪問語句對應(yīng)的預(yù)編譯數(shù)據(jù)訪問語句中的總表標(biāo)識替換為對應(yīng)的分表標(biāo)識,再執(zhí)行替換后的預(yù)編譯數(shù)據(jù)庫訪問語句。
在本申請實(shí)施例中,若該待執(zhí)行sql語句存在對應(yīng)的預(yù)編譯sql語句,則此時(shí),該jdbc驅(qū)動可先調(diào)取該待執(zhí)行sql語句對應(yīng)的預(yù)編譯sql語句,再根據(jù)在步驟s202中確定的與該待執(zhí)行數(shù)據(jù)庫訪問語句對應(yīng)的替換關(guān)系,將該預(yù)編譯sql語句中的總表標(biāo)識替換為對應(yīng)的分表標(biāo)識,最后直接執(zhí)行替換后的預(yù)編譯sql語句。
具體的,該jdbc驅(qū)動,可先調(diào)取該待執(zhí)行sql語句對應(yīng)的預(yù)編譯sql語句以及記錄在發(fā)送該待執(zhí)行sql語句的線程中線程變量中的替換關(guān)系,之后再根據(jù)該替換關(guān)系中總表標(biāo)識與分表標(biāo)識的對應(yīng)關(guān)系,將該待執(zhí)行sql語句對應(yīng)的預(yù)編譯sql語句中的總表標(biāo)識替換為對應(yīng)的分表標(biāo)識,最后直接執(zhí) 行替換后的預(yù)編譯sql語句。
繼續(xù)沿用上例,該jdbc驅(qū)動將該待執(zhí)行sql語句select*fromvcc_coucher_00whereuser_id=‘官方’對應(yīng)的預(yù)編譯sql語句select*fromvcc_coucherwhereuser_id=‘官方’調(diào)取出來,再根據(jù)該線程a的線程變量中記錄的替換關(guān)系,將該預(yù)編譯sql語句中的總表標(biāo)識vcc_coucher替換為分表標(biāo)識vcc_coucher_00,最后替換后的預(yù)編譯sql語句。
通過圖2所示的數(shù)據(jù)庫語句執(zhí)方法,若該待執(zhí)行數(shù)據(jù)庫訪問語句存在對應(yīng)的預(yù)編譯數(shù)據(jù)庫訪問語句,則可以根據(jù)預(yù)先記錄的該待執(zhí)行數(shù)據(jù)庫訪問語句對應(yīng)的替換關(guān)系,將該待執(zhí)行數(shù)據(jù)庫訪問語句對應(yīng)的預(yù)編譯數(shù)據(jù)訪問語句中的總表標(biāo)識替換為對應(yīng)的分表標(biāo)識,再執(zhí)行替換后的預(yù)編譯數(shù)據(jù)庫訪問語句,由于圖1所示的編譯過程中,針對每個分表的相同結(jié)構(gòu)的數(shù)據(jù)庫訪問語句,jbdc驅(qū)動都預(yù)編譯為同一個預(yù)編譯數(shù)據(jù)庫訪問語句,所以在執(zhí)行各分表具有相同結(jié)構(gòu)的待執(zhí)行數(shù)據(jù)庫訪問語句時(shí),僅需要對與該待執(zhí)行數(shù)據(jù)庫訪問語句對應(yīng)的預(yù)編譯數(shù)據(jù)庫訪問語句進(jìn)行一次總表標(biāo)識替換為分表標(biāo)識的過程,就相當(dāng)于實(shí)現(xiàn)了對該待執(zhí)行數(shù)據(jù)庫訪問語句的預(yù)編譯,使得jdbc驅(qū)動可以直接執(zhí)行該替換后的預(yù)編譯數(shù)據(jù)庫訪問語句,保證了數(shù)據(jù)庫訪問語句的執(zhí)行效率的同時(shí),減少了終端的存儲壓力。
基于圖1所示的數(shù)據(jù)庫語句編譯過程,本申請實(shí)施例還提供一種數(shù)據(jù)庫語句編譯裝置,如圖3所示。
圖3是本申請實(shí)施例提供一種數(shù)據(jù)庫語句編譯裝置的結(jié)構(gòu)示意圖,具體包括:
接收模塊301,用于接收攜帶數(shù)據(jù)庫訪問語句的預(yù)編譯請求,其中所述數(shù)據(jù)庫訪問語句中包含數(shù)據(jù)表標(biāo)識;
替換模塊302,用于當(dāng)所述數(shù)據(jù)表標(biāo)識為分表標(biāo)識時(shí),根據(jù)預(yù)先保存的分表標(biāo)識與總表標(biāo)識的對應(yīng)關(guān)系,將所述數(shù)據(jù)庫訪問語句中的分表標(biāo)識替換為對應(yīng)的總表標(biāo)識;
編譯模塊303,用于對替換后的數(shù)據(jù)訪問語句進(jìn)行預(yù)編譯。
所述替換模塊302還用于,記錄所述數(shù)據(jù)庫訪問語句中的分表標(biāo)識與對應(yīng)的總表標(biāo)識之間的替換關(guān)系,以便在執(zhí)行預(yù)編譯后的數(shù)據(jù)庫訪問語句時(shí),根據(jù)所述替換模塊302記錄的所述替換關(guān)系,將所述預(yù)編譯后的數(shù)據(jù)庫訪問語句中的總表標(biāo)識替換為對應(yīng)的分表標(biāo)識,再執(zhí)行。
所述接收模塊301具體用于,接收線程發(fā)送的攜帶數(shù)據(jù)庫訪問語句的預(yù)編譯請求。
所述替換模塊302具體用于,將所述替換關(guān)系記錄在所述線程的線程變量中。
具體的,上述如圖3所示的數(shù)據(jù)庫語句編譯裝置可以位于終端中,該終端可以是手機(jī)、平板電腦或者pc。
基于圖2所示的數(shù)據(jù)庫語句執(zhí)行過程,本申請實(shí)施例還提供一種數(shù)據(jù)庫語句執(zhí)行裝置,如圖4所示。
圖4是本申請實(shí)施例提供一種數(shù)據(jù)庫語句執(zhí)行裝置的結(jié)構(gòu)示意圖,具體包括:
接收模塊401,用于接收待執(zhí)行數(shù)據(jù)庫訪問語句;
判斷執(zhí)行模塊402,用于判斷所述待執(zhí)行數(shù)據(jù)庫訪問語句是否存在對應(yīng)的預(yù)編譯數(shù)據(jù)庫訪問語句,若不存在,則對所述待執(zhí)行數(shù)據(jù)庫訪問語句進(jìn)行預(yù)編譯后,執(zhí)行預(yù)編譯后的數(shù)據(jù)庫訪問語句,若存在,則根據(jù)預(yù)先記錄的所述待執(zhí)行數(shù)據(jù)庫訪問語句對應(yīng)的替換關(guān)系,將所述待執(zhí)行數(shù)據(jù)庫訪問語句對應(yīng)的預(yù)編譯數(shù)據(jù)訪問語句中的總表標(biāo)識替換為對應(yīng)的分表標(biāo)識,再執(zhí)行替換后的預(yù)編譯數(shù)據(jù)庫訪問語句。
所述接收模塊401具體用于,接收線程發(fā)送的待執(zhí)行數(shù)據(jù)庫訪問語句,所述判斷執(zhí)行模塊402具體用于,根據(jù)記錄在所述線程的線程變量中的替換關(guān)系,將所述待執(zhí)行數(shù)據(jù)庫訪問語句對應(yīng)的預(yù)編譯數(shù)據(jù)庫訪問語句中的總表標(biāo)識替換為對應(yīng)的分表標(biāo)識。
具體的,上述如圖3所示的數(shù)據(jù)庫語句編譯裝置可以位于終端中,該終端可以是手機(jī)、平板電腦或者pc。
在一個典型的配置中,計(jì)算設(shè)備包括一個或多個處理器(cpu)、輸入/輸出接口、網(wǎng)絡(luò)接口和內(nèi)存。
內(nèi)存可能包括計(jì)算機(jī)可讀介質(zhì)中的非永久性存儲器,隨機(jī)存取存儲器(ram)和/或非易失性內(nèi)存等形式,如只讀存儲器(rom)或閃存(flashram)。內(nèi)存是計(jì)算機(jī)可讀介質(zhì)的示例。
計(jì)算機(jī)可讀介質(zhì)包括永久性和非永久性、可移動和非可移動媒體可以由任何方法或技術(shù)來實(shí)現(xiàn)信息存儲。信息可以是計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序的模塊或其他數(shù)據(jù)。計(jì)算機(jī)的存儲介質(zhì)的例子包括,但不限于相變內(nèi)存(pram)、靜態(tài)隨機(jī)存取存儲器(sram)、動態(tài)隨機(jī)存取存儲器(dram)、其他類型的隨機(jī)存取存儲器(ram)、只讀存儲器(rom)、電可擦除可編程只讀存儲器(eeprom)、快閃記憶體或其他內(nèi)存技術(shù)、只讀光盤只讀存儲器(cd-rom)、數(shù)字多功能光盤(dvd)或其他光學(xué)存儲、磁盒式磁帶,磁帶磁磁盤存儲或其他磁性存儲設(shè)備或任何其他非傳輸介質(zhì),可用于存儲可以被計(jì)算設(shè)備訪問的信息。按照本文中的界定,計(jì)算機(jī)可讀介質(zhì)不包括暫存電腦可讀媒體(transitorymedia),如調(diào)制的數(shù)據(jù)信號和載波。
還需要說明的是,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、商品或者設(shè)備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、商品或者設(shè)備所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括所述要素的過程、方法、商品或者設(shè)備中還存在另外的相同要素。
本領(lǐng)域技術(shù)人員應(yīng)明白,本申請的實(shí)施例可提供為方法、系統(tǒng)或計(jì)算機(jī)程序產(chǎn)品。因此,本申請可采用完全硬件實(shí)施例、完全軟件實(shí)施例或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本申請可采用在一個或多個其中包含有計(jì)算 機(jī)可用程序代碼的計(jì)算機(jī)可用存儲介質(zhì)(包括但不限于磁盤存儲器、cd-rom、光學(xué)存儲器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。
以上所述僅為本申請的實(shí)施例而已,并不用于限制本申請。對于本領(lǐng)域技術(shù)人員來說,本申請可以有各種更改和變化。凡在本申請的精神和原理之內(nèi)所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本申請的權(quán)利要求范圍之內(nèi)。