專利名稱:一種利用緩存表來提高數(shù)據(jù)庫數(shù)據(jù)插入性能的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種利用緩存表來提高數(shù)據(jù)庫數(shù)據(jù)插入性能的方法。
背景技術(shù):
大型業(yè)務(wù)應(yīng)用系統(tǒng),一般都要將系統(tǒng)相關(guān)業(yè)務(wù)數(shù)據(jù)存儲到數(shù)據(jù)庫之中。在系統(tǒng)實際運行過程中,將同類型的新增業(yè)務(wù)數(shù)據(jù)寫入到數(shù)據(jù)庫對應(yīng)的數(shù)據(jù)表中,數(shù)據(jù)表的數(shù)據(jù)存儲在服務(wù)器的硬盤,硬盤的寫入性能影響了數(shù)據(jù)表的插入性能,當(dāng)前硬盤的讀寫性能是服務(wù)器各組件中最低的一部分,硬盤的讀寫性能成為數(shù)據(jù)庫數(shù)據(jù)表的插入性能的瓶頸。為了提高數(shù)據(jù)庫的插入效率,現(xiàn)有采用的技術(shù)方案有升級服務(wù)器硬件或者批量插入。通過升級服務(wù)器硬件(主要是硬盤)的方法,可以較簡單地實現(xiàn)數(shù)據(jù)庫插入性能的提升,但是提升范圍有限,且硬件開銷比較大,綜合性價比不高。批量插入是一種將多條待插入數(shù)據(jù)拼接成一條語句然后一次提交到數(shù)據(jù)庫執(zhí)行的方法,可以不用升級硬件就獲取到較大的性能提升,但在系統(tǒng)新增業(yè)務(wù)數(shù)據(jù)量巨大,業(yè)務(wù)系統(tǒng)對該表讀取頻繁的情況下容易造成數(shù)據(jù)表被鎖住,從而引發(fā)頻繁、階段性的性能下降, 不利于系統(tǒng)的穩(wěn)定。
發(fā)明內(nèi)容
針對現(xiàn)有技術(shù)方案的不足,本發(fā)明提出一種利用緩存表來提高數(shù)據(jù)庫插入性能的方法,可以在不用升級硬件、避免造成數(shù)據(jù)庫死鎖的條件下大大提高數(shù)據(jù)庫的插入性能。本發(fā)明一種利用緩存表來提高數(shù)據(jù)庫數(shù)據(jù)插入性能的方法,首先建立兩個基于內(nèi)存的數(shù)據(jù)庫緩存表,該緩存表與待最終插入的目的數(shù)據(jù)表的表結(jié)構(gòu)相同;先將數(shù)據(jù)插入到第一緩存表中,待第一緩存表中的數(shù)據(jù)超過最大個數(shù)閾值后,再將第一緩存表的數(shù)據(jù)批量導(dǎo)入到目的數(shù)據(jù)表,在導(dǎo)入過程中,若有新的數(shù)據(jù)要插入數(shù)據(jù)庫,則將新的數(shù)據(jù)插入到第二緩存表中,待第二緩存表中的數(shù)據(jù)超過最大個數(shù)閾值后,再將該第二緩存表中的數(shù)據(jù)導(dǎo)入到目的數(shù)據(jù)表中,該第一或第二緩存表一旦將其中的數(shù)據(jù)導(dǎo)入至目的數(shù)據(jù)表中后,則所述的第一或第二緩存表立即清空;上述往第一或第二緩存表插入數(shù)據(jù)到最大個數(shù)閾值所需要的時間必須大于將該第一或第二緩存表中的數(shù)據(jù)導(dǎo)入到目的數(shù)據(jù)表所需時間。采用本發(fā)明的技術(shù)方案后,由于緩存表是建立在內(nèi)存之上,所以該表的插入性能取決于內(nèi)存的寫入性能,遠遠大于基于硬盤的數(shù)據(jù)表,只要在保證緩存表的容量夠大的前提下,則就可以獲取到近似于緩存表的數(shù)據(jù)插入性能。
圖1為本發(fā)明的流程示意圖。以下結(jié)合附圖和具體實施例對本發(fā)明作進一步詳述。
具體實施方式
本發(fā)明一種利用緩存表來提高數(shù)據(jù)庫數(shù)據(jù)插入性能的方法,首先建立兩個基于內(nèi)存的數(shù)據(jù)庫緩存表,該緩存表與待最終插入的目的數(shù)據(jù)表的表結(jié)構(gòu)相同,因為緩存表是建立在內(nèi)存之上,所以該表的插入性能取決于內(nèi)存的寫入性能,遠遠大于基于硬盤的數(shù)據(jù)表; 先將數(shù)據(jù)插入到第一緩存表中,待第一緩存表中的數(shù)據(jù)超過最大個數(shù)閾值后,再將第一緩存表的數(shù)據(jù)批量導(dǎo)入到目的數(shù)據(jù)表,在導(dǎo)入過程中,若有新的數(shù)據(jù)要插入數(shù)據(jù)庫,則將新的數(shù)據(jù)插入到第二緩存表中,待第二緩存表中的數(shù)據(jù)超過最大個數(shù)閾值后,再將該第二緩存表中的數(shù)據(jù)導(dǎo)入到目的數(shù)據(jù)表中,該第一或第二緩存表一旦將其中的數(shù)據(jù)導(dǎo)入至目的數(shù)據(jù)表中后,則所述的第一或第二緩存表立即清空;上述往第一或第二緩存表插入數(shù)據(jù)到最大個數(shù)閾值所需要的時間必須大于將該第一或第二緩存表中的數(shù)據(jù)導(dǎo)入到目的數(shù)據(jù)表所需時間。如圖1所示,本發(fā)明具體實現(xiàn)步驟如下
步驟1、選用MYSQL作為數(shù)據(jù)庫引擎來部署數(shù)據(jù)庫,創(chuàng)建業(yè)務(wù)系統(tǒng)數(shù)據(jù)庫BizDB ;
步驟2、在業(yè)務(wù)系統(tǒng)數(shù)據(jù)庫BizDB中創(chuàng)建以下數(shù)據(jù)表
目的數(shù)據(jù)表,表引擎選擇Mylsam,表結(jié)構(gòu)中定義若干數(shù)據(jù)字段;
建立基于內(nèi)存的第一和第二數(shù)據(jù)庫緩存表,該緩存表的表結(jié)構(gòu)與目的數(shù)據(jù)表相同;
步驟3、在業(yè)務(wù)系統(tǒng)數(shù)據(jù)庫BizDB中創(chuàng)建以下存儲過程
存儲過程1 參數(shù)為第一緩存表中各字段,將各參數(shù)插入到第一緩存表中,然后返回第一緩存表的當(dāng)前數(shù)據(jù)行數(shù),如果插入失敗則返回0 ;
存儲過程2 參數(shù)為第二緩存表中各字段,將各參數(shù)插入到第二緩存表中,然后返回第二緩存表的當(dāng)前數(shù)據(jù)行數(shù),如果插入失敗則返回0 ;
存儲過程3 參數(shù)為整型,限制為1或2,返回值BOOL型,根據(jù)參數(shù)將對應(yīng)的緩存表中的數(shù)據(jù)存入目的數(shù)據(jù)表中,存成功后將原緩存表清空,并返回操作結(jié)果;
步驟4、創(chuàng)建業(yè)務(wù)程序,設(shè)置緩存表最大行數(shù)限制閾值,根據(jù)預(yù)先配置好的參數(shù)連接業(yè)務(wù)系統(tǒng)數(shù)據(jù)庫BizDB,初始化當(dāng)前緩存表標志位為1 ;
步驟5、等待待插入的業(yè)務(wù)數(shù)據(jù),一旦接收到待插入的數(shù)據(jù),則根據(jù)當(dāng)前緩存表標志位選擇待插入數(shù)據(jù)的存儲過程,如果當(dāng)前緩存表標志為1則執(zhí)行步驟3中的存儲過程1,如果當(dāng)前緩存表標志位為2,則執(zhí)行步驟3中的存儲過程2 ;
步驟6、執(zhí)行插入數(shù)據(jù)的存儲過程,并判斷其返回值,如果返回值大于0且小于緩存表最大行數(shù)限制閾值,說明存儲過程執(zhí)行成功,且緩存表數(shù)據(jù)未滿,執(zhí)行步驟9,如果返回值為 0,執(zhí)行步驟7,如果返回值大于緩存表最大行數(shù)限制閾值,執(zhí)行步驟8 ; 步驟7、程序執(zhí)行異常,進行相應(yīng)的異常處理,并打印日志,執(zhí)行步驟9 ; 步驟8、若存儲過程返回值大于緩存表最大行數(shù)限制閾值,說明該緩存表中的數(shù)據(jù)已滿,切換緩存表標志位,原來為1的改為2,原來為2的改為1,并執(zhí)行存儲過程3,將數(shù)據(jù)已滿的所述緩存表中的數(shù)據(jù)導(dǎo)入到目的數(shù)據(jù)表中,執(zhí)行步驟9 ;
步驟9、判斷是否結(jié)束數(shù)據(jù)插入,如果是則執(zhí)行步驟10,如果否則執(zhí)行步驟5 ; 步驟10、關(guān)閉數(shù)據(jù)庫連接,退出數(shù)據(jù)插入過程。以上所述,僅是本發(fā)明較佳實施例而已,并非對本發(fā)明的技術(shù)范圍作任何限制,故凡是依據(jù)本發(fā)明的技術(shù)實質(zhì)對以上實施例所作的任何細微修改、等同變化與修飾,均仍屬于本發(fā)明技術(shù)方案的范圍內(nèi)。
權(quán)利要求
1. 一種利用緩存表來提高數(shù)據(jù)庫數(shù)據(jù)插入性能的方法,其特征在于 首先建立兩個基于內(nèi)存的數(shù)據(jù)庫緩存表,該緩存表與待最終插入的目的數(shù)據(jù)表的表結(jié)構(gòu)相同;先將數(shù)據(jù)插入到第一緩存表中,待第一緩存表中的數(shù)據(jù)超過最大個數(shù)閾值后,再將第一緩存表的數(shù)據(jù)批量導(dǎo)入到目的數(shù)據(jù)表,在導(dǎo)入過程中,若有新的數(shù)據(jù)要插入數(shù)據(jù)庫,則將新的數(shù)據(jù)插入到第二緩存表中,待第二緩存表中的數(shù)據(jù)超過最大個數(shù)閾值后,再將該第二緩存表中的數(shù)據(jù)導(dǎo)入到目的數(shù)據(jù)表中,該第一或第二緩存表一旦將其中的數(shù)據(jù)導(dǎo)入至目的數(shù)據(jù)表中后,則所述的第一或第二緩存表立即清空;上述往第一或第二緩存表插入數(shù)據(jù)到最大個數(shù)閾值所需要的時間必須大于將該第一或第二緩存表中的數(shù)據(jù)導(dǎo)入到目的數(shù)據(jù)表所需時間。
全文摘要
本發(fā)明一種利用緩存表來提高數(shù)據(jù)庫數(shù)據(jù)插入性能的方法,首先建立兩個基于內(nèi)存的數(shù)據(jù)庫緩存表,該緩存表與待最終插入的目的數(shù)據(jù)表的表結(jié)構(gòu)相同;先將數(shù)據(jù)插入到第一緩存表中,待第一緩存表中的數(shù)據(jù)超過最大個數(shù)閾值后,再將第一緩存表的數(shù)據(jù)批量導(dǎo)入到目的數(shù)據(jù)表,在導(dǎo)入過程中,若有新的數(shù)據(jù)要插入數(shù)據(jù)庫,則將新的數(shù)據(jù)插入到第二緩存表中,待第二緩存表中的數(shù)據(jù)超過最大個數(shù)閾值后,再將該第二緩存表中的數(shù)據(jù)導(dǎo)入到目的數(shù)據(jù)表中;本發(fā)明可以在不用升級硬件、避免造成數(shù)據(jù)庫死鎖的條件下大大提高數(shù)據(jù)庫的插入性能。
文檔編號G06F17/30GK102542054SQ20111045012
公開日2012年7月4日 申請日期2011年12月29日 優(yōu)先權(quán)日2011年12月29日
發(fā)明者余建成, 傅建記, 吳曉前, 詹友陸 申請人:廈門雅迅網(wǎng)絡(luò)股份有限公司