作者介紹
農行研發中心“數風云”團隊,一支朝氣蓬勃、快速成長的技術團隊,始終致力于農行大數據、數據庫和云計算等領域的應用實踐與技術創新,探索數據賦能,勇攀數據云巔,為企業數字化轉型和金融科技發展不斷貢獻力量。
日常開發中,當遇到數據的批量插入和更新等問題時經常會使用到JDBC的executeBatch()方法,來實現批量執行語句的功能。近期項目組在開發過程中,遇到了一個奇怪的現象,使用了executeBatch()方法進行批量數據處理,在測試過程中發現數據庫(MySQL8.0.18)端日志收到的請求SQL仍是逐條收到的,并不是預期的批量收到請求批量執行。
為驗證此問題,進行如下測試。通過循環的方式分別批量執行3條update語句,調試方式查看執行情況。發現數據庫端日志,三條update是分別收到的,如圖1所示,數據庫端收到的SQL均有時間間隔。在詳細調試應用端請求,發現通過executeBatch()方法實際與數據庫進行了3次交互,每次僅發送了一條SQL請求(如圖2 所示)。
String sql = "update test set name="test" where id = ?";
PreparedStatement ps = conn.prepareStatement(sql);
for (int i = 1; i < n ;i++) {
ps.setInt(1, i);
ps.addBatch();
}
ps.executeBatch();
圖1 批量執行3條SQL數據庫端日志
圖2 批量執行3條SQL的詳細報文中交互情況
這是什么原因?executeBatch()沒生效?批量方法使用有問題?帶著這些問題查閱MySQL驅動源碼(版本8.0.18)一探究竟。分別查閱Statement和PrepareStatement的executeBatch()實現方式,發現要達到批量方式執行效果,二者均對關鍵屬性rewriteBatchedStatements進行了判斷。還可以發現當PrepareStatement中含有空語句,或實際批量執行的SQL數量未大于3條(使用Statement時未大于4條),MySQL驅動仍將繼續按照單條SQL的方式進行執行,而非批量執行。因此,在JDBC連接串中增加該參數配置,如:
jdbc:mysql://ip:端口/mytest?rewriteBatchedStatements=true
設置后增多批量SQL執行數量時(如循環添加4條SQL),數據庫端收到的SQL請求變為批量收到。詳細調試應用端請求時,發現應用端實際與數據庫交互變為1次(如圖5所示),發送的報文請求是整體待執行的SQL(如圖6所示)。SQL請求終于成功實現批量執行。
圖3 Statement實現的SQL批量執行邏輯
圖4 PrepareStatement現的SQL批量執行邏輯
圖5 批量執行4條SQL數據庫端日志
圖6 批量執行4條SQL的詳細報文中交互情況
除rewriteBatchedStatements參數外,驅動源碼中對allowMultiQueries也進行了判斷。該參數是否影響批量處理和執行呢?經查閱官網allowMultiQueries不影響addBatch()和executeBatch()的執行,該配置控允許使用“;”在一條語句中分隔多個查詢
圖7 allowMultiQueries參數
若未設置該參數,MySQL驅動層將嘗試向數據庫發送開啟多語句支持的請求,并在最終執行完成后,再次向數據庫發送關閉多語句支持的請求。額外的開啟和關閉多語句支持的請求動作,可能對一些進行了分布式事務進行多語句提交優化的分布式數據庫造成影響。
因此,作為最佳實踐,建議在jdbc參數中rewriteBatchedStatements和allowMultiQueries=true同時設置。
圖8 開啟MultiQueries
圖9 發送開啟MultiQueries請求
圖10 關閉MultiQueries
圖11 發送關閉MultiQueries請求
結論:使用JDBC的executeBatch()批量執行方法,需要JDBC參數需設置rewriteBatchedStatements=true,并且批量執行的數據大于3條,并不包含空語句時。驅動將以批量的形式進行交互。并且建議設置allowMultiQueries=true參數,可減少對數據庫的額為請求。
dbaplus社群歡迎廣大技術人員投稿,投稿郵箱:editor@dbaplus.cn
更多干貨
四期精選“數據庫”主題直播回看:
數據庫前沿技術實踐與應用趨勢探討:http://z-mz.cn/4CjCp
金融業數據庫轉型與國產化改造:http://z-mz.cn/3QOjX
主流關系型分布式數據庫選型與設計實戰:http://z-mz.cn/3GOHl
金融級數據庫架構設計與運維實踐:http://z-mz.cn/1vTkl
關注公眾號dbaplus社群回復【220318】,可獲取配套PPT哦~
關注公眾號【dbaplus社群】,獲取更多原創技術文章和精選工具下載
責任編輯:Rex_08