1. 程式人生 > >JAVA對MYSQL資料庫進行批量操作,addBatch(),executeBatch()方法

JAVA對MYSQL資料庫進行批量操作,addBatch(),executeBatch()方法

有人說MySql的JDBC驅動,不是真正支援批量操作的,就算你在程式碼中呼叫了批量操作的方法,MySql的JDBC驅動也是按照一般操作來處理的。

但其實並非如此,Mysql 是有特殊的方式優化整個batch insert 結果的。

可不可以先假設 batch 的方式與非batch一樣,每一條insrt語句事實上均是單獨發往伺服器的呢?

瀏覽下原始碼吧。

好多兄弟都描述了原始碼,直接從那幾個類入手吧,事實上關鍵的類是這個 com.mysql.jdbc.PreparedStatement

先看了其中的 addBatch 方法,沒有任何問題,只是將語句新增進入一個 List 中儲存。

那麼 executeBatch 呢?

再貼一下吧, 關鍵看其中的這部分,順帶說一下, 這個mysql-jdbcdriver的原始碼是 5.1.13的 

try {   
    clearWarnings();   
  
    if (!this.batchHasPlainStatements   
            && this.connection.getRewriteBatchedStatements()) {   
           
           
        if (canRewriteAsMultiValueInsertAtSqlLevel()) {   
            return executeBatchedInserts(batchTimeout); //執行路徑之一   
        }   
           
        if (this.connection.versionMeetsMinimum(4, 1, 0)    
                && !this.batchHasPlainStatements   
                && this.batchedArgs != null    
                && this.batchedArgs.size() > 3 /* cost of option setting rt-wise */) {   
            return executePreparedBatchAsMultiStatement(batchTimeout); //執行路徑之二   
        }   
    }   
  
    return executeBatchSerially(batchTimeout); //執行路徑之三   
} finally {   
    clearBatch();   
} 

其實最終,executeBatch 的執行路徑有三種可能。程式碼中我已標出來


程式碼不算太複雜,但是有一個引數能幫助我們更快的確定mysql的batch工作機制,那就是
mysql jdbc driver 的connection url, 其中有一個引數是: rewriteBatchedStatements


完整的引數參考看這裡:http://ftp.ntu.edu.tw/ftp/pub/MySQL/doc/refman/5.1/en/connector-j-reference-configuration-properties.html

rewriteBatchedStatements 引數預設為false, 需要手工設定為true,設定方式大概像這樣:
String connectionUrl="jdbc:mysql://192.168.1.100:3306/test?rewriteBatchedStatements=true";    

預設時候,rewriteBatchedStatements=false時,執行路徑會跳到 executeBatchSerially,此方法內部將語句一條條傳送,與非batch處理簡直一樣,所以慢,就在這裡了。

當設為 true時,會執行executeBatchedInserts方法,事實上mysql支援這樣的插入語句
insert into t_user(id,uname) values(1, '1'), (2,'2'), (3, '3') ....  

針對rewriteBatchedStatements=true 引數我做了測試,我加了這個引數,做同們的插入10萬條記錄測試:
我的mysql 安裝的虛擬機器上,所以慢一些。
MySql JDBC 驅動版本 結果
5.0.8 沒有提高 18秒
5.1.7 沒有提高 18秒
5.1.13 有提高 1.6秒

所以Mysql的批量操作一定要加上MySql連線的url中要加rewriteBatchedStatements引數設為true

相關推薦

JAVAMYSQL資料庫進行批量操作addBatch(),executeBatch()方法

有人說MySql的JDBC驅動,不是真正支援批量操作的,就算你在程式碼中呼叫了批量操作的方法,MySql的JDBC驅動也是按照一般操作來處理的。 但其實並非如此,Mysql 是有特殊的方式優化整個batch insert 結果的。 可不可以先假設 batch 的方式與非

JDBC javaMySQL資料庫進行查詢操作並把查詢的結果輸出

Resultset中的所有資料都可以通過getString()方法取得 String是可以接收表中的任意型別列的內容,所以在以下的程式中全部都使用getString()接收 package JDBC;

JavaMySQL資料庫進行操作java

資料庫幾乎是每一個應用型的程式都會用到,學會如何高效操作資料庫也是開發一個重點。今天我總結了具體的操作步驟以及注意點。Java訪問資料庫主要用的方法是JDBC,它是java語言中用來規範客戶端程式如何來訪問資料庫的應用程式介面,提供了諸如查詢和更新資料庫中資料的方法,接下來

Spring Boot 2.x使用Spring Data JpaMySQL資料庫進行CRUD操作

 只需兩步!Eclipse+Maven快速構建第一個Spring Boot專案 構建了第一個Spring Boot專案。 Spring Boot連線MySQL資料庫 連線了MySQL資料庫。 本文在之前的基礎上,使用Spring Data Jpa對MySQL

ibatisMySQL資料庫批量操作

對於批量操作,iBATIS提供了兩種方式:     使用iterate標籤,進行批量插入操作;     使用普通的SQL呼叫,提交時使用batch提交。 下面一一介紹: 1、使用iterate標籤,進

分別使用PreparedStatement和Statementmysql資料庫進行建立表增加資料查詢資料和刪除資料過程

在使用eclipse工具編寫Java程式碼連線資料庫並對資料庫進行處理時,總會用到對資料的增刪改查操作。那麼這個 時候就用到了java自帶的sql庫中的PreparedStatement或者Statement了。 其實PreparedStatement和Statement使

C++MySQL資料庫進行匯出和匯入操作

相信大家應該在網上看到很多利用SQL語句對MySQL資料庫的表或者資料庫本身進行匯出和匯入操作。在window環境下利用dos命令列匯出資料庫(我的mysq直接裝在c盤根目錄下下,其bin目錄為:c:/mysql/bin): 1、執行MySQL資料庫匯出操作: c:\my

初識和利用Servlet獲取和顯示頁面提交的資料以及MySQL資料庫的簡單操作 7.04

Servlet:web伺服器端的程式設計技術。是繼承了javax.servlet.http.HttpServlet類的Java類。由支援servlet的web伺服器(tomcat)呼叫和啟動執行。一個

用JavaScriptMySQL資料庫進行操作方法

Javascript訪問Access很容易實現,但JS訪問MYSQL卻沒有找到很簡單的方法。今天在瀏覽MYSQL網站時,發現MYSQL有ODBC連線,突然想到JS是可以通過ActiveX訪問ODBC資料庫的,經過測試發現JS連線MYSQL如此簡單!1、下載MYSQL的ODB

使用Java語言實現MySQL資料庫的基本操作

       在資料庫的使用中最為主要的就是對資料庫的增、刪、查、改操作,MySQL資料庫作為關係型資料庫的一種,其資料庫管理系統是由瑞典MySQL AB 公司開發,目前屬於 Oracle 旗下產品。MySQL 是最流行的關係型資料庫管理系統之一,在 WE

Javamysql資料庫的增刪改查創表5個操作

package mywork.com; import java.sql.*; import java.text.DecimalFormat; // DecimalFormat df = new DecimalFormat("#0.000"); import java.util.Scanner; import

scalikejdbc框架mysql資料庫進行增刪改查事務建立

1.在scala中想要操作mysql數庫中的資料,可以使用scalikejdbc。 2.匯入依賴。 3.在resource檔案中新增application.conf檔案。然後配置引數。 db.def

jdbc連線Oracle/MySQL資料庫進行批量匯入操作,如何提高效率???

package com.test.main; import java.sql.BatchUpdateException; import java.sql.Connection; import java.sql.PreparedStatement; import java.util.Date; impor

python使用sqlalchemy中介軟體MYSQL資料庫進行建立、查詢、刪除操作

首先安裝sqlalchemy,安裝方法有兩種:通過官網下載原始碼進行安裝;使用pip install sqlachemly 1.建立操作資料庫介面模組api.py, 描述: 在介面模組中首先建立一個engine,這裡關聯的是mysql資料庫,也可以是其他型別的資料庫 然後定

eclipse(JavaMySQL資料庫進行連線、查詢和修改

  (1) 呼叫Class.forName()方法載入驅動程式。   (2) 呼叫DriverManager物件的getConnection()方法,獲得一個Connection物件。   (3) 建立一個Statement物件,準備一個SQL語句,這個SQL語句可以是Statement物件(立即執行的的語

Python3:sqlalchemymysql數據庫操作非sql語句

quest 用戶 prim bind afa make -c 細節 strip() Python3:sqlalchemy對mysql數據庫操作,非sql語句 # python3 # author lizm # datetime 2018-02-01 10:00:00 #

linux下啟用定時任務mysql資料庫進行定時備份

                                          &

DJANGO專案用WEB的方式MYSQL資料庫進行備份匯出等管理任務的實現

環境:PYTHON2.7,DJANGO1.9.9 urls.py 加一行: url(r'^mysqldatamanage/', views.mysqldatamanage,name='mysqldatamanage'),   views.py新增對應的方mysqldatam

java 時間資料進行操作

Date time = new Date(); Calendar cal = Calendar.getInstance(); if (time != null) { cal.setTime(time); cal.set(Calendar.HOUR_OF_DAY, 23); cal.se

Mysql資料庫的基本操作的一些總結

Mysql資料庫的基本操作 總注:所有sql語句結尾處最好加上分號符; MySQL中的一些語句使用方法: #檢視所有的資料庫 show databases;   #檢視資料庫下所有的表 show tables;   注:sql語句不區分大小寫,但是嚴重區分中英文