1. 程式人生 > >關於jdbc批量操作(addBatch, executeBatch)的測試【轉載】

關於jdbc批量操作(addBatch, executeBatch)的測試【轉載】

由於專案上有大批量資料插入和更新的操作,所以使用了jdbc的批量操作功能。在此之前參考了很多文章包括jdbc的手冊(https://www.tutorialspoint.com/jdbc/jdbc-batch-processing.htm),有說需要使用事務的,也有的文章沒有使用事務,試了很久,發現程式碼一直沒有按照期望的執行,還是逐條操作資料庫。後來在偶然間看到了文章提到需要設定rewriteBatchedStatements為true,加上該引數後搞定!這裡記錄一下我所做個幾個場景的實驗,並配有抓包的記錄,以顯示jdbc批量操作的過程。


測試使用的表結構如下:

[sql]
  view plain  copy
  1. create table employees (  
  2.   id int(11) unsigned not null auto_increment,  
  3.   user_id int(20) not null,  
  4.   age int
    (10) not null,  
  5.   first_name varchar(20) not null,  
  6.   second_name varchar(20) not null,  
  7.   date date not null,  
  8.   PRIMARY KEY (id)  
  9. ) ENGINE=InnoDB CHARSET=utf8;  

使用tcpdump抓包,並在wireshark下做分析


場景一:不使用事務,不新增rewriteBatchedStatements=true引數

程式碼隱去資料庫ip、庫名、賬戶名和密碼

[java]  view plain  copy
  1. package jdbcbatchtest;  
  2.   
  3.   
  4. import java.sql.Connection;  
  5. import java.sql.DriverManager;  
  6. import java.sql.PreparedStatement;  
  7. import java.sql.SQLException;  
  8.   
  9. public class Main {  
  10.     public static void main(String[] args) {  
  11.         Connection conn = null;  
  12.         PreparedStatement pst = null;  
  13.           
  14.         try {  
  15.             Class.forName("com.mysql.jdbc.Driver");  
  16.             conn = DriverManager.getConnection("jdbc:mysql://********:3306/****""****""****");  
  17.               
  18.             String sql = "insert into employees (user_id, age, first_name, second_name, date) values(?,?,?,?,?)";  
  19.               
  20.             pst = conn.prepareStatement(sql);  
  21.               
  22.             int loop = 0;  
  23.             for(loop = 0; loop < 1000; loop++) {  
  24.                 pst.setInt(1, loop);  
  25.                 pst.setInt(218);  
  26.                 pst.setString(3"roger");  
  27.                 pst.setString(4"zhang");  
  28.                 pst.setString(5"2017-01-17");  
  29.                 pst.addBatch();  
  30.             }  
  31.   
  32.             pst.executeBatch();  
  33.         } catch (ClassNotFoundException e) {  
  34.             e.printStackTrace();  
  35.         } catch (SQLException e) {  
  36.             e.printStackTrace();  
  37.         } finally {  
  38.             if(pst != null) {  
  39.                 try {  
  40.                     pst.close();  
  41.                 } catch (SQLException e) {  
  42.                     e.printStackTrace();  
  43.                 }  
  44.             }  
  45.               
  46.             if(conn != null) {  
  47.                 try {  
  48.                     conn.close();  
  49.                 } catch (SQLException e) {  
  50.                     e.printStackTrace();  
  51.                 }  
  52.             }  
  53.         }  
  54.     }  
  55. }  
  56.       

抓包結果:


從圖片中的抓包結果可以看出,sql語句是逐條被提交到mysql伺服器的,該操作一共執行了1000次。

場景二:使用事務,不新增rewriteBatchedStatements=true引數

[java]  view plain  copy
  1. package jdbcbatchtest;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.DriverManager;  
  5. import java.sql.PreparedStatement;  
  6. import java.sql.SQLException;  
  7.   
  8.   
  9. public class Main {  
  10.   
  11.     public static void main(String[] args) {  
  12.         Connection conn = null;  
  13.         PreparedStatement pst = null;  
  14.           
  15.         try {  
  16.             Class.forName("com.mysql.jdbc.Driver");  
  17.             conn = DriverManager.getConnection("jdbc:mysql://********:3306/****""****""****");  
  18.               
  19.             String sql = "insert into employees (user_id, age, first_name, second_name, date) values(?,?,?,?,?)";  
  20.               
  21.             conn.setAutoCommit(false);  
  22.             pst = conn.prepareStatement(sql);  
  23.               
  24.             int loop = 0;  
  25.             for(loop = 0; loop < 1000; loop++) {  
  26.                 pst.setInt(1, loop);  
  27.                 pst.setInt(218);  
  28.                 pst.setString(3"roger");  
  29.                 pst.setString(4"zhang");  
  30.                 pst.setString(5"2017-01-17");  
  31.                 pst.addBatch();  
  32.             }  
  33.   
  34.             pst.executeBatch();  
  35.             conn.commit();  
  36.         } catch (ClassNotFoundException e) {  
  37.             e.printStackTrace();  
  38.         } catch (SQLException e) {  
  39.             e.printStackTrace();  
  40.             try {  
  41.                 conn.rollback();  
  42.             } catch (SQLException e1) {  
  43.                 e1.printStackTrace();  
  44.             }  
  45.         } finally {  
  46.             if(pst != null) {  
  47.                 try {  
  48.                     pst.close();  
  49.                 } catch (SQLException e) {  
  50.                     e.printStackTrace();  
  51.                 }  
  52.             }  
  53.               
  54. 相關推薦

    關於jdbc批量操作(addBatch, executeBatch)的測試轉載

    由於專案上有大批量資料插入和更新的操作,所以使用了jdbc的批量操作功能。在此之前參考了很多文章包括jdbc的手冊(https://www.tutorialspoint.com/jdbc/jdbc-batch-processing.htm),有說需要使用事務的,也有的文章沒有使用事務,試了很久,發現

    轉載安全測試常用工具

    ase exploit thumb unet ngs IT學習 戰略 頁面 -a http://blog.csdn.net/huangjin0507/article/details/52453137 下面介紹了這些工具的主要功能以及教程、書籍、視頻等。 端口掃描器:

    轉載JAVA多線程讀取、操作List集合

    線程 nbsp static 一點 stat lang 素數 param 應用 本文轉載自:http://blog.csdn.net/wang1989cs/article/details/47663565 import java.util.ArrayList; impor

    Selenium2+python自動化54-unittest生成測試報告(HTMLTestRunner)轉載

    logs mage 部分 art 測試結果 函數返回 top default 執行 本篇轉自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/tag/unittest/ 前言 批量執行完用例後,生成的測試報告是文本形式的,不夠直

    selenium+python自動化78-autoit參數化與批量上傳轉載

    Coding fmt def all 電腦 定位 ext for alt 轉至博客:上海-悠悠 前言前一篇autoit實現文件上傳打包成.exe可執行文件後,每次只能傳固定的那個圖片,我們實際測試時候希望傳不同的圖片。這樣每次調用的時候,在命令行裏面加一個文件路徑的參數就行

    每天一個linux命令(文件操作):轉載find命令之xargs

    溢出 系統性能 問題 ameba pri 幾分鐘 body 只有一個 獲取參數   在使用 find命令的-exec選項處理匹配到的文件時, find命令將所有匹配到的文件一起傳遞給exec執行。但有些系統對能夠傳遞給exec的命令長度有限制,這樣在find命令運行幾分鐘之

    轉載JAVA中IO流操作的基本規律總結

    reader 對象 作文 若是 gpo 是否 目的 io流 基本 流操作的基本規律:三個明確 1.明確源和目的; 源:輸入流即讀取流 InputStream,Reader 目的:輸出流即寫入流 OutputStream, Writer 2.明確操作的數據是

    每天一個linux命令(文件上傳下載文件操作):轉載tar命令

    設備 mil second compress bsp 新的 body 創建 命令格式   通過SSH訪問服務器,難免會要用到壓縮,解壓縮,打包,解包等,這時候tar命令就是是必不可少的一個功能強大的工具。linux中最流行的tar是麻雀雖小,五臟俱全,功能強大。   tar

    每天一個linux命令(文件上傳下載文件操作):轉載gzip命令

    明顯 相關信息 users 版本信息 通過 inux 備份 示例 strong   減少文件大小有兩個明顯的好處,一是可以減少存儲空間,二是通過網絡傳輸文件時,可以減少傳輸的時間。gzip是在Linux系統中經常使用的一個對文件進行壓縮和解壓縮的命令,既方便又好用。gzip

    轉載Qt中圖像的顯示與基本操作

    繪制 nta pen 位置 產生 縮放 eas urn mod Qt可顯示基本的圖像類型,利用QImage、QPxmap類可以實現圖像的顯示,並且利用類中的方法可以實現圖像的基本操作(縮放、旋轉)。 參考:Qt中圖像的顯示與基本操作 - ykm0722的專欄 - 博客頻道

    轉載Python操作Excel的讀取以及寫入

    body .sh open 列數 讀取 efault jin rap ring 轉載來源:https://jingyan.baidu.com/article/e2284b2b754ac3e2e7118d41.html #導入包 import xlrd #設置路徑 path

    轉載IntelliJ IDEA配置JUnit進行單元測試

    dbd ima pom.xml format height eight nsh 格式 oot 前提條件 安裝JDK,並配置好環境變量 工程已解決JUnit依賴關系(pom.xml) IDEA中JUnit配置 IDEA自帶一個JUnit插件,打開Settings窗口搜

    轉載批量修改文件後綴

    遇到 文本文 問題 pac 如果 文件夾 文本 電腦 文本文件   以前曾經遇到過這種問題,意義的該雖然不難,就是太麻煩了。真好今天看到了科學網的RSS推送過來了,就記下了。感謝原作者!! 通常批量修改文件後綴,可以利用現有的軟件,如TC等,如果電腦上沒有這個軟件,則可

    轉載2017 軟件測試行業現狀調查報告_From_51testing_On_20180625

    圖片 com sting margin cti 下載 from 一份 月份 這份報告由51Testing 發布,他們會在每年年中發布會一份測試行業調查報告,今年是在6月份發布的。 報告下載地址: http://www.51testing.com/index.php?act

    為何雜散測試需要使用濾波器轉載

    濾波器 這樣的 4.3 無線 高通 類型 前端 測試結果 概述 1.概述   在ITU-R SM.329-11 建議書中,對雜散發射(spurious emission)的定義如下:   雜散發射指的是在必要帶寬之外的一個或多個頻率上的發射,其發射電平可以降低其

    轉載性能測試應該怎麽做?

    收集 ali user mar target pan zoom mark 導致 偶然間看到了阿裏中間件Dubbo的性能測試報告,我覺得這份性能測試報告讓人覺得做這性能測試的人根本不懂性能測試,我覺得這份報告會把大眾帶溝裏去,所以,想寫下這篇文章,做一點科普。 首先,這份測

    轉載LoadRunner效能測試指揮中心Controller 《第四篇》

    轉載出處:https://www.cnblogs.com/kissdodog/p/3772901.html   一、設計場景   1、設計效能測試場景   Controller有兩個檢視:設計(Design)檢視和執行(Run)檢視。啟動Controller,在Controller主介面裡,

    轉載Python字串操作之字串分割與組合

    1、 str.split():字串分割函式   通過指定分隔符對字串進行切片,並返回分割後的字串列表。   語法:   str.split(s, num)[n]   引數說明:   s:表示指定的分隔符,不寫的話,預設是空格(’ ‘)。如果字串中沒有給定的分隔符時,則把整個字串作為列表的一個元素返回。   n

    轉載測試工程師怎麽甩鍋

    波浪 由於 缺陷報告 支持我 產生 上線 我們 img 們的 如果說到最困擾軟件測試工程師的幾大問題,我們最先能想到的無非是以下幾點: 需求帶著小姨子跑路啦,沒有需求我咋測試啦。。。 開發牛皮哄哄啦,他打了我,還說我報的不是BUG。。。 測試時間不夠啦,項目質量這麽爛怎麽還

    轉載批量維護(建立/修改)客戶主資料函式 SD_CUSTOMER_MAINTAIN_ALL BP自定義螢幕 資料維護

    可以用來維護BP自定義螢幕的資料。 分享一下批建立客戶主資料函式:SD_CUSTOMER_MAINTAIN_ALL   TABLES:T077D,ZCITY,T005S,BNKA,ADRC,KNA1.   DATA: TMP_KTOKD(4) TYPE