Shardingsphere sql執行結果合併

2021-10-02 00:19:05 字數 4363 閱讀 5015

之前講過,shardingpreparedstatement覆寫了executequeryexecuteupdateexecute等主要方法,這些方法中都有initpreparedstatementexecutor方法。

這個方法主要是呼叫了preparedstatementexecutor.init(sqlrouteresult),根據路由的結果sqlrouteresult中的routeunit集合建立statementexecuteunit集合物件,並儲存在abstractstatementexecutor的屬性executegroups中。其間會根據邏輯資料來源名稱獲取真實資料來源datasource,並從資料來源獲取連線connection,進而從連線處獲取statement

public

final

class

preparedstatementexecutor

extends

abstractstatementexecutor

}private collection

>

obtainexecutegroups

(final collection

routeunits)

throws sqlexception

@override

public statementexecuteunit createstatementexecuteunit

(final connection connection,

final routeunit routeunit,

final connectionmode connectionmode)

throws sqlexception })

;}

因此,init()方法其實是把sqlrouteresult中的routeunit物件轉換為shardingexecutegroup物件集合並從資料來源獲取連線和preparedstatement的過程。

preparedstatementexecutorexecutequery()executeupdate()或者execute()方法被呼叫,不管哪個方法被呼叫,都會執行到preparedstatementexecutor的父類abstractstatementexecutor中的executecallback(sqlexecutecallbackexecutecallback)方法:

對應的原始碼:

public list

executequery()

throws sqlexception };

return

executecallback

(executecallback);}

public

intexecuteupdate()

throws sqlexception

else

}public

boolean

execute()

throws sqlexception

return result.

get(0)

;}

被呼叫abstractstatementexecutor的方法executecallback原始碼:

protected

final

list

executecallback

(final sqlexecutecallback

executecallback)

throws sqlexception

從上面原始碼可以看到executecallback()方法呼叫了sqlexecutetemplateexecutegroup()方法,此方法呼叫shardingexecuteenginegroupexecute()執行shardingexecutegroupexecutegroup()以及相關方法原始碼如下:

public

final

class

sqlexecutetemplate

catch

(final sqlexception ex)}}

public

final

class

shardingexecuteengine

implements

autocloseable

return serial ?

serialexecute

(inputgroups, firstcallback, callback)

:parallelexecute

(inputgroups, firstcallback, callback);}

}

這裡會有同步執行和多執行緒執行兩種:

private

list

serialexecute

(final collection

> inputgroups,

final shardinggroupexecutecallback

firstcallback,

final shardinggroupexecutecallback

callback)

throws sqlexception

return result;

}private

list

parallelexecute

(final collection

> inputgroups,

final shardinggroupexecutecallback

firstcallback,

final shardinggroupexecutecallback

callback)

throws sqlexception

private

collection

>>

asyncgroupexecute

(final list

> inputgroups,

final shardinggroupexecutecallback

callback)

return result;

}private

listenablefuture

>

asyncgroupexecute

(final shardingexecutegroup

inputgroup,

final shardinggroupexecutecallback

callback)})

;}private

collection

syncgroupexecute

(final shardingexecutegroup

executegroup,

final shardinggroupexecutecallback

callback)

throws sqlexception

如果執行的是executequery()則返回的是乙個list集合,此時需要呼叫mergeenginemerge()方法對queryresult集合進行合併:

mergeengine介面有兩個實現類:dqlmergeenginedalmergeengine,這兩個實現類分別負責資料查詢sql的合併和資料庫管理sql的合併。

獲取執行緒的執行結果

最本質的區別在於,runnable沒有返回結果,callable會有乙個返回結果,返回結果是泛型,可以自己定義。舉例子說明 上述例子中可以看到,callable可以定義乙個返回結果,通過futuretask的get方法可以獲得執行緒執行後的結果 阻塞等待結果 原始碼檢視 allocates a ne...

c 執行命令列獲取執行結果

最早用了一種方法,cmd.exe c 命令 結合 單管道重定向輸出資訊來dos命令輸出結果,但這種方法在命令比較複雜 夾雜多個空格,雙引號 的情況 會導致cmd.exe無法正確解析出要執行的命令,出現命令傳遞錯誤,執行失敗.命令格式參見幫助 dos下執行 cmd 之後用雙管道,重定向命令輸入和命令結...

golang執行命令獲取執行結果狀態 推薦

這幾天在用golang寫乙個工具,要執行外部命令工具,而且還要將外部命令工具輸出的日誌也要輸出出來。網上找了一下,資料很多,關鍵是執行的結果成功或失敗狀態沒找到好的方法獲取到。剛開始想的是看錯誤日誌,如果有錯誤日誌,那麼就是執行失敗。測試的時候發現這樣不行,發現有些時候會用error輸出日誌,但不一...