使用JDBC連接MySQL數據庫進行數據插入的時候,特別是大批量數據連續插入(100000),如何提高效率呢?
在JDBC編程接口中Statement 有兩個方法特別值得注意:
通過使用addBatch()
和executeBatch()
這一對方法可以實現批量處理數據。
不過值得注意的是,首先需要在數據庫鏈接中設置手動提交,connection.setAutoCommit(false)
,然后在執行Statement之后執行connection.commit()
。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
import java.io.BufferedReader; import java.io.IOException; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Date; import com.mysql.jdbc.Connection; public class MysqlBatchUtil { private String sql= "INSERT INTO db_test (param1,param2,param3,param4,param5) VALUES (?,?,?,?,?)" ; private String charset= "utf-8" ; private String connectStr= "jdbc:mysql://localhost:3306/test" ; private String username= "root" ; private String password= "123456" ; private void doStore() throws ClassNotFoundException, SQLException, IOException { Class.forName( "com.mysql.jdbc.Driver" ); connectStr += "?useServerPrepStmts=false&rewriteBatchedStatements=true" ; //此處是測試高效批次插入,去掉之后執行時普通批次插入 Connection conn = (Connection) DriverManager.getConnection(connectStr, username,password); conn.setAutoCommit( false ); // 設置手動提交 int count = 0 ; PreparedStatement psts = conn.prepareStatement(sql); String line = null ; Date begin= new Date(); for ( int i= 0 ;i<= 100000 ;i++){ psts.setString( 1 , i+ "param1" ); psts.setString( 2 , i+ "param2" ); psts.setString( 3 , i+ "param3" ); psts.setString( 4 , i+ "param4" ); psts.setString( 5 , i+ "param5" ); psts.addBatch(); // 加入批量處理 count++; } psts.executeBatch(); // 執行批量處理 conn.commit(); // 提交 Date end= new Date(); System.out.println( "數量=" +count); System.out.println( "運行時間=" +(end.getTime()-begin.getTime())); conn.close(); } public static void main(String[] args) { try { new MysqlBatchUtil().doStore(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } |
測試結果:
數量=100001
運行時間=4725
一共10W,執行時間一共花費 47 秒.
這個效率仍然不高,似乎沒有達到想要的效果,需要進一步改進。
在MySQL JDBC連接字符串中還可以加入參數,
1
|
rewriteBatchedStatements= true |
mysql默認關閉了batch處理,通過此參數進行打開,這個參數可以重寫向數據庫提交的SQL語句
1
|
useServerPrepStmts= false |
如果不開啟(useServerPrepStmts=false),使用com.mysql.jdbc.PreparedStatement進行本地SQL拼裝,最后送到db上就是已經替換了?后的最終SQL.
在此稍加改進,連接字符串中加入下面語句(代碼構造方法中去掉注釋):
1
|
connectStr += "?useServerPrepStmts=false&rewriteBatchedStatements=true" ; |
再次測試結果如下:
數量=100001
運行時間=1213
同樣的數據量,這次執行只花費了12秒 ,由此可見處理效率大大提高,呵呵
以上所述是小編給大家介紹的Java使用JDBC向MySQL數據庫批次插入10W條數據測試效率,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:http://www.cnblogs.com/wangyayun/archive/2016/12/29/6231832.html