基于高級語言并發(fā)聚合計算的分庫分表merge查詢方法【
技術領域:
】[0001]本發(fā)明涉及一種在傳統(tǒng)關系型數據庫分庫分表基礎上進行SQLmerge查詢的方法,具體涉及一種基于高級語言并發(fā)聚合計算的分庫分表merge查詢方法,屬于信息
技術領域:
?!?br>背景技術:
】[0002]隨著互聯(lián)網技術和物聯(lián)網的發(fā)展,很多傳統(tǒng)行業(yè)投入到了互聯(lián)網中來,產生了大量的“互聯(lián)網+”的需求,這些需求很多是基于大數據的。而目前流行的互聯(lián)網大數據解決方案,是基于分布式數據庫和分布式的MapReduce方案的。[0003]分布式數據庫和分布式MapReduce解決方案是當今非常流行的大數據計算框架,具有計算能力強、容錯性和數據可用性強、可擴展性強等特點。[0004]然而,分布式數據庫和分布式MapReduce解決方案也有如下缺點:[0005]1.由于是新技術,還沒有統(tǒng)一的標準,那么,對于特定問題的處理需要用戶進一步編程解決。不存在像關系數據庫那么成熟的SQL標準。[0006]2.分布式數據庫的管理不成熟,管理方面的人才缺乏。不像關系數據庫的管理那么成熟,管理人才也多。[0007]3.繼續(xù)使用關系數據庫,對于客戶來說,有著利舊方面的考慮。很多用戶已經在關系數據庫上投入了很大人力物力,希望能夠將這些人力物力有效的利用起來,而目前全部轉向分布式數據庫和分布式MapReduce方案,則不利于利舊。[0008]4.很多項目,是在進行持續(xù)集成和持續(xù)交付,一開始,在數據量不是很多的時候,選擇了關系數據庫;隨著用戶業(yè)務的不斷增大,數據量也不斷增大。這時候考慮的大數據解決方案,仍然希望持續(xù)集成、平滑交付。直接換分布式數據庫和分布式MapReduce方案,則存在巨大的升級交付風險。[0009]圖2是Hadoop系統(tǒng)的MapReduce框架。MapReduce任務執(zhí)行的一般流程是:[0010]1.Mapper任務從HDFS或其他分布式數據庫上讀取數據塊(split)。[0011]2.每個Mapper任務調用map函數,對每一個數據塊進行處理,處理的結果寫入緩存或磁盤。[0012]3.Mapper執(zhí)行完之后,數據在本地進行排序和合并(有可能經過本地的combine)。[0013]4.經過Shuffle階段,每個節(jié)點把本地數據發(fā)送給對應的Reducer所在的節(jié)點。[0014]5.在Reducer本地進行排序和合并。[0015]6.Reducer處理本地的數據,并將結果寫入HDFS。[0016]從上面的執(zhí)行流程來看,MapReduce解決方案是一個全新的數據處理方案,在處理過程中,要么完全不用傳統(tǒng)的關系數據庫,要么用到也只是簡單的從數據庫里取出原始的數據,不能最大限度的利用SQL標準;其次,不管是MapReduce工具Hadoop,還是分布式數據庫hbase等,對于開發(fā)來說,都是全新的技術,有相當的學習曲線;最后,分布式數據庫hbase對于用戶來說,也是全新的技術,用戶不像關系數據庫那樣,有成熟的維護機制和人員?!?br/>發(fā)明內容】[0017]本發(fā)明的目的是在使用傳統(tǒng)關系數據庫做分庫分表來存儲大數據的基礎上,利用算法將查詢Map到每一個分庫和分表,然后利用關系數據庫的強大SQL功能查詢出每一個分庫和每一個分表的結果,最后利用高級語言的聚合計算技術,把分庫分表結果聚合出一個最終結果。[0018]為了使得傳統(tǒng)數據庫能夠存儲大數據,利用關系數據庫的分庫分表來存儲大數據,本發(fā)明在Springtemplate技術的基礎上,實現了分庫分表的增刪改查。[0019]為了實現分庫分表后對全部的分庫分表,或者部分的分庫分表進行SQLmerge查詢,本發(fā)明在利用強大的SQL查詢的基礎上,使用異步的、非阻塞的分庫分表SQL查詢,然后將所有的查詢結果,使用高級語言的stream技術,聚合起來,形成最終結果。[0020]本發(fā)明提出了一種使用高級語言stream技術聚合分庫分表的merge查詢的方法,其步驟為:[0021](I)客戶端通過代理服務子模塊調用dao層方法來查詢分庫分表數據;[0022](2)代理服務子模塊的處理單元ProxyHandler通過代理技術接收到查詢請求,調用分庫分表選擇子模塊,解析出本次查詢涉及到的分庫和分表,這種解析包括多個可擴展分庫解析算法和多個可擴展的分表解析算法,默認實現了根據ID(機構ID或其他ID)的求余算法、根據月份的分庫算法、根據日期的分表算法和根據ID(機構ID或其他ID)的求余算法;[0023](3)代理服務子模塊的處理單元ProxyHandler根據分庫和分表結果,利用Java高級語言的異步并發(fā)特性CompletableFuture,去調用實際的dao類對象并發(fā)查詢所有的分庫和分表;[0024](4)所有的分庫和分表,都調用dao類對象方法,在調用該dao類方法的過程中,通過AOP技術觸發(fā)調用了分庫分表子模塊,通過AOP技術實現的攔截器去攔截該方法,以獲取步驟2中所得到的分庫分表參數。[0025](5)分庫分表子模塊的攔截器獲取到分庫分表參數以后,通過ThreadLocal技術保存分庫鍵值和分表鍵值,ThreadLocal技術是一個線程安全的數據存儲技術,保證每一個調用dao類方法的線程,都有自己的分庫鍵值和分表鍵值。[0026](6)分庫分表子模塊的攔截器最后真正調dao類對象方法,dao類方法是通過springjdbctemplate技術實現的,springjdbctemplate從ThreadLocal對象里獲取到該分庫鍵值和分表鍵值精確定位分庫分表,獲取查詢結果。[0027](7)代理服務子模塊調用分庫分表查詢結果并發(fā)聚合子模塊將所有的CompletableFuture壓入到Stream中,使用并發(fā)的stream聚合技術,將所有分庫分表查詢結果聚合,獲取最終的查詢結果;[0028](8)代理服務子模塊將最終結果返回給客戶端;[0029](9)如果是分頁查詢,本發(fā)明在查詢總記錄數的時候,會將每個分表的查詢記錄數保存在緩存,在查詢分頁記錄的時候,就根據每個分表的記錄數確定該分頁記錄在哪個分表上,然后直接去該分表上查詢結果;[0030](10)整個過程,客戶端就像調用一個普通的dao方法一樣,沒有任何使用上的復雜度。[0031]所述框架既利用了關系數據庫強大的SQL查詢功能,又通過高級語言的聚合算法,將分散的查詢結果聚合成最終結果。[0032]通過高效的算法,快速的確定本次查詢所涉及到的分庫和分表,然后通過異步的、非阻塞的算法去查詢每一個分庫和分表。[0033]然后,將查詢結果匯聚到stream里,通過stream的并發(fā)reduce算法,迅速的獲得最終結果。[0034]更進一步,分頁的查詢結果,通過在查詢總記錄數的時候,保存到緩存的每個分表的記錄數,來確定當前分頁記錄集需要查詢哪個分表,快速的定位和查詢分頁結果。[0035]更進一步,每個分頁的記錄數保存在本地緩存中,緩存控制著數據的清除管理,從而保證了緩存不會因為數據過多而造成內存泄漏。[0036]更進一步,在計算基于時間的分表算法中,使用了Java8的LocalDate技術,能夠快速的確定分表。[0037]更進一步,分庫的鍵值是通過ThreadLocal保存在內存中,從而保證了并發(fā)的dao層訪問的分庫鍵值的安全性。[0038]更進一步,通過annotat1n技術來確定是做分表查詢,還是做merge查詢,同時查詢的有幾個并列的分表。[0039]本發(fā)明的有益效果:[0040]1.利用了傳統(tǒng)的、穩(wěn)定的關系數據庫技術,有利于客戶的利舊和維護,有利于降低開發(fā)人員技術要求。[0041]2.利用了關系數據庫強大的SQL標準,既通過分庫分表解決了關系數據庫存儲大數據的問題,又利用SQL標準強大的計算能力。[0042]3.本發(fā)明引入了Java8的CompletableFuture技術和stream技術,它們都是異步的、非阻塞的技術,最后完成分庫分表的關系數據庫分布式結果的聚合工作。[0043]綜上所述,本發(fā)明首先通過擴展Springtemplate技術來解決關系數據庫分庫分表的問題。利用ThreadLocal來保證并發(fā)訪問的分庫鍵值的安全性。其次,本發(fā)明利用CompletableFuture技術來異步的、非阻塞的查詢各分庫和分表;最后,本發(fā)明使用stream技術來聚合所有的查詢結果,形成最終結果返回給客戶端。既利用了傳統(tǒng)關系數據的強大數據分析能力,又使用了最新的stream技術將中間結果reduce成最終結果。既保留了傳統(tǒng)關系數據庫的穩(wěn)定性和強大的功能,又給傳統(tǒng)數據庫擴展了最新的MapReduce技術?!靖綀D說明】[0044]圖1為分布式的MapReduce技術Hadoop的系統(tǒng)架構圖;[0045]圖2為本發(fā)明基于AOP的關系數據庫分庫分表單表操作方法系統(tǒng)架構圖;[0046]圖3為本發(fā)明基于stream的關系數據庫分庫分表SQLmerge查詢方法系統(tǒng)架構圖;[0047]圖4為本發(fā)明基于stream的關系數據庫分庫分表SQLmerge查詢方法流程圖?!揪唧w實施方式】[0048]下面詳細說明本發(fā)明的實現步驟和具體方法。[0049]本發(fā)明的實現是基于傳統(tǒng)關系數據庫的分庫分表和高級語言stream聚合技術的一套MapReduce方法。通過對傳統(tǒng)數據庫通過分庫分表來存儲大數據,又通過高級語言stream聚合技術來解決傳統(tǒng)分庫分表不能做MapReduce功能的缺陷。[0050]下面首先給出整個基于高級語言聚合計算的分庫分表merge查詢的架構圖,說明整個工作流程和主要的模塊任務,最后分表描述每個模塊的具體實現。[0051]本發(fā)明的系統(tǒng)架構圖如圖2和圖3所示。由于本發(fā)明的最終目的是構建一個基于高級語言聚合計算的分庫分表MapReduceSQL查詢框架,因此系統(tǒng)架構圖包含了一個最基本的分庫分表基礎算法,它用來確定一個具體的分庫及具體的分表,而多個分庫分表的查詢則是對一個具體的分庫及具體的分表的多次并發(fā)調用得到的。要想得到多個分庫分表,就必須根據輸入條件,使用高效的算法來計算分庫和分表的鍵值。根據鍵值和庫名和表當前第1頁1 2