<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>
  • 主站蜘蛛池模板: 国产熟女露脸大叫高潮| 久久精品夜夜夜夜夜久久| 亚洲精品无码mv在线观看| 久久国产精品99精品国产| 91福利国产在线观看网站| 美女的扒开尿口让男人桶动态图| 老子午夜我不卡理论影院| 欧美三级中文字幕完整版| 天天爽天天干天天操| 国产亚洲欧美精品久久久| 亚洲免费成人网| a级成人毛片久久| 亚洲国产精品网站久久| 三上悠亚伦理片| 高清影院在线欧美人色| 欧美孕交videosfree黑| 天堂岛最新在线免费看电影| 四虎国产精品免费久久| 久久精品无码一区二区三区不卡| 国产你懂的视频| 欧美在线视频二区| 天天操天天射天天| 人人爽人人爽人人爽人人片av | 成人一级片在线观看| 国产又黄又爽无遮挡不要vip| 亚洲午夜爱爱香蕉片| 四虎永久在线观看视频精品| 欧美精品黑人粗大| 大香伊蕉在人线国产最新75| 免费国产成人午夜在线观看| 三级免费黄录像| 男女午夜特黄毛片免费| 尹人香蕉网在线观看视频| 国产l精品国产亚洲区在线观看| 久久午夜无码鲁丝片| 免费在线h视频| 最新国产精品亚洲| 国产极品白嫩精品| 亚洲va国产va天堂va久久| 3d动漫精品一区二区三区| 毛片网站在线观看|