之前講過,shardingpreparedstatement
覆寫了executequery
、executeupdate
、execute
等主要方法,這些方法中都有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
的過程。
類preparedstatementexecutor
的executequery()
、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()
方法呼叫了sqlexecutetemplate
的executegroup()
方法,此方法呼叫shardingexecuteengine
的groupexecute()
執行shardingexecutegroup
,executegroup()
以及相關方法原始碼如下:
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
集合,此時需要呼叫mergeengine
的merge()
方法對queryresult集合進行合併:
mergeengine
介面有兩個實現類:dqlmergeengine
和dalmergeengine
,這兩個實現類分別負責資料查詢sql的合併和資料庫管理sql的合併。
獲取執行緒的執行結果
最本質的區別在於,runnable沒有返回結果,callable會有乙個返回結果,返回結果是泛型,可以自己定義。舉例子說明 上述例子中可以看到,callable可以定義乙個返回結果,通過futuretask的get方法可以獲得執行緒執行後的結果 阻塞等待結果 原始碼檢視 allocates a ne...
c 執行命令列獲取執行結果
最早用了一種方法,cmd.exe c 命令 結合 單管道重定向輸出資訊來dos命令輸出結果,但這種方法在命令比較複雜 夾雜多個空格,雙引號 的情況 會導致cmd.exe無法正確解析出要執行的命令,出現命令傳遞錯誤,執行失敗.命令格式參見幫助 dos下執行 cmd 之後用雙管道,重定向命令輸入和命令結...
golang執行命令獲取執行結果狀態 推薦
這幾天在用golang寫乙個工具,要執行外部命令工具,而且還要將外部命令工具輸出的日誌也要輸出出來。網上找了一下,資料很多,關鍵是執行的結果成功或失敗狀態沒找到好的方法獲取到。剛開始想的是看錯誤日誌,如果有錯誤日誌,那麼就是執行失敗。測試的時候發現這樣不行,發現有些時候會用error輸出日誌,但不一...