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
相關推薦
JAVA對MYSQL資料庫進行批量操作,addBatch(),executeBatch()方法
有人說MySql的JDBC驅動,不是真正支援批量操作的,就算你在程式碼中呼叫了批量操作的方法,MySql的JDBC驅動也是按照一般操作來處理的。 但其實並非如此,Mysql 是有特殊的方式優化整個batch insert 結果的。 可不可以先假設 batch 的方式與非
JDBC java對MySQL資料庫進行查詢操作,並把查詢的結果輸出
Resultset中的所有資料都可以通過getString()方法取得 String是可以接收表中的任意型別列的內容,所以在以下的程式中全部都使用getString()接收 package JDBC;
Java對MySQL資料庫進行操作【java】
資料庫幾乎是每一個應用型的程式都會用到,學會如何高效操作資料庫也是開發一個重點。今天我總結了具體的操作步驟以及注意點。Java訪問資料庫主要用的方法是JDBC,它是java語言中用來規範客戶端程式如何來訪問資料庫的應用程式介面,提供了諸如查詢和更新資料庫中資料的方法,接下來
Spring Boot 2.x使用Spring Data Jpa對MySQL資料庫進行CRUD操作
只需兩步!Eclipse+Maven快速構建第一個Spring Boot專案 構建了第一個Spring Boot專案。 Spring Boot連線MySQL資料庫 連線了MySQL資料庫。 本文在之前的基礎上,使用Spring Data Jpa對MySQL
ibatis對MySQL資料庫的批量操作
對於批量操作,iBATIS提供了兩種方式: 使用iterate標籤,進行批量插入操作; 使用普通的SQL呼叫,提交時使用batch提交。 下面一一介紹: 1、使用iterate標籤,進
分別使用PreparedStatement和Statement對mysql資料庫進行建立表,增加資料,查詢資料和刪除資料過程
在使用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)呼叫和啟動執行。一個
用JavaScript對MySQL資料庫進行操作的方法
Javascript訪問Access很容易實現,但JS訪問MYSQL卻沒有找到很簡單的方法。今天在瀏覽MYSQL網站時,發現MYSQL有ODBC連線,突然想到JS是可以通過ActiveX訪問ODBC資料庫的,經過測試發現JS連線MYSQL如此簡單!1、下載MYSQL的ODB
使用Java語言實現對MySQL資料庫的基本操作
在資料庫的使用中最為主要的就是對資料庫的增、刪、查、改操作,MySQL資料庫作為關係型資料庫的一種,其資料庫管理系統是由瑞典MySQL AB 公司開發,目前屬於 Oracle 旗下產品。MySQL 是最流行的關係型資料庫管理系統之一,在 WE
Java對mysql資料庫的增刪改查創表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(Java)對MySQL資料庫進行連線、查詢和修改
(1) 呼叫Class.forName()方法載入驅動程式。 (2) 呼叫DriverManager物件的getConnection()方法,獲得一個Connection物件。 (3) 建立一個Statement物件,準備一個SQL語句,這個SQL語句可以是Statement物件(立即執行的的語
Python3:sqlalchemy對mysql數據庫操作,非sql語句
quest 用戶 prim bind afa make -c 細節 strip() Python3:sqlalchemy對mysql數據庫操作,非sql語句 # python3 # author lizm # datetime 2018-02-01 10:00:00 #
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語句不區分大小寫,但是嚴重區分中英文