sharding-jdbc源碼學習筆記(四)----併發執行和結果歸併

一,併發執行sql問題,多庫同時併發,提升效率。
若是是執行單條sql,在當前線程執行;
若是是執行多條sql在不一樣的庫中或者同一個庫中多個表裏面,當前線程執行第一條sql,使用線程池執行其餘的sql。
好比查詢某個商戶下面全部的帳戶,帳戶可能根據id規則分佈在不一樣的數據庫中,須要執行分片個數條sql,須要併發執行查詢。sql

二,結果歸併彙總,多庫查詢後,須要對結果進行加工,才能得出正確的數據。
1,無排序,無聚合函數,無分頁的多庫查詢結果合併
這種是最簡單的一種狀況,多條sql執行後,獲得多個resultSet,把多個resultSet簡單合併,
遍歷每一個resultSet執行resultSet.next()獲取數據記錄便可,每次獲取1條記錄。
好比查詢某個商戶下面全部的帳戶,帳戶可能根據id規則分佈在不一樣的數據庫中,須要執行分片個數條sql,結果合併就是這種狀況。數據庫

2,有排序,無聚合函數,無分頁的多庫查詢結果合併
多條sql執行後,獲得多個resultSet,把多個resultSet放入一個排序隊列中,按每一個resultSet的第一條記錄排序,每次出隊第一條記錄,
至關於每次取多個resultSet中排序後記錄最小或者最大的那條。併發

3,有排序,有聚合函數,而且排序和聚合字段相同,無分頁的結果合併
a,按聚合(或排序)字段排序:多條sql執行後,獲得多個resultSet,把多個resultSet放入一個排序隊列中,按每一個resultSet的第一條記錄排序,每次出隊第一條記錄,
至關於每次取多個resultSet中排序後記錄最小或者最大的那條。
b,按順序取出記錄後,把聚合字段值相同的記錄裏面的聚合字段值進行統計,sum,count,max,min四種。
若是聚合字段值變了,再次從新開始統計。每次統計後造成一條真正的記錄對外輸出。
c,對於avg函數,對外輸出記錄的時候,計算得出avg = sum/count函數

4,有分頁的狀況
對應上面幾種狀況的結果,按分頁偏移量信息,忽略偏移量前面的記錄,從偏移量位置開始真正輸出。大數據


5,有排序,有聚合函數,而且排序和聚合字段不相同,無分頁的結果合併
這個場景支持在內存中聚合和排序,注意大數據量致使內存溢出。
a,遍歷每個查詢的結果集裏面的每一條記錄,按聚合字段進行聚合計算。
b,聚合計算結果再按排序字段進行排序。線程

相關文章
相關標籤/搜索