<bdo id="ks4iu"><del id="ks4iu"></del></bdo>
  • 
    <pre id="ks4iu"></pre>
  • <bdo id="ks4iu"><del id="ks4iu"></del></bdo>
    <input id="ks4iu"><em id="ks4iu"></em></input>
    
    
  • <center id="ks4iu"><cite id="ks4iu"></cite></center>
  • 首頁 > 空調 >

    你的executeBatch()是批量方式執行嗎?

    作者介紹

    農行研發中心“數風云”團隊,一支朝氣蓬勃、快速成長的技術團隊,始終致力于農行大數據、數據庫和云計算等領域的應用實踐與技術創新,探索數據賦能,勇攀數據云巔,為企業數字化轉型和金融科技發展不斷貢獻力量。

    日常開發中,當遇到數據的批量插入和更新等問題時經常會使用到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

    關鍵詞: test true
    推薦閱讀
    欧美国产在线一区,免费看成年视频网页,国产亚洲福利精品一区,亚洲一区二区约美女探花
    <bdo id="ks4iu"><del id="ks4iu"></del></bdo>
  • 
    <pre id="ks4iu"></pre>
  • <bdo id="ks4iu"><del id="ks4iu"></del></bdo>
    <input id="ks4iu"><em id="ks4iu"></em></input>
    
    
  • <center id="ks4iu"><cite id="ks4iu"></cite></center>
  • 主站蜘蛛池模板: 91香蕉成人免费网站| 爱福利极品盛宴| 九九精品免视看国产成人| 亚洲av无码片一区二区三区| 久久电影网午夜鲁丝片免费 | www.99re| 5╳社区视频在线5sq| 精品国产综合区久久久久久 | 亚洲老妈激情一区二区三区| 久久丫精品久久丫| 亚洲精品短视频| 精品国产不卡一区二区三区| 日韩人妻潮喷中文在线视频| 国产精品国产午夜免费福利看| 国产精品久久久小说| 人妻少妇精品视频一区二区三区| 中文字幕电影资源网站大全| 好吊色青青青国产在线播放| 精品久久人人做人人爽综合 | 美女被男人扒开腿猛视频| 波多野结衣办公室33分钟| 成年人在线免费观看视频网站| 国产在亚洲线视频观看| 伊人色综合网一区二区三区| 中文字幕乱码一区二区免费| 高潮毛片无遮挡高清免费视频| 欧美a级完整在线观看| 好紧我太爽了视频免费国产| 日本猛少妇色xxxxx猛交| 国产无套粉嫩白浆在线观看| 亚洲国产成人久久综合区| 一级毛片**不卡免费播| 免费能直接在线观看黄的视频| 欧美综合自拍亚洲综合图| 无人在线观看视频高清视频8| 国产精品自在线拍国产手机版| 人文艺术欣赏ppt404| 69网站在线观看| 晚上看b站直播软件| 国产成人亚洲综合无码精品| 亚洲欧洲日产国产最新|