国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java使用JDBC向MySQL數據庫批次插入10W條數據(測試效率)

2019-11-26 13:22:18
字體:
來源:轉載
供稿:網友

使用JDBC連接MySQL數據庫進行數據插入的時候,特別是大批量數據連續插入(100000),如何提高效率呢?

在JDBC編程接口中Statement 有兩個方法特別值得注意:

通過使用addBatch()executeBatch()這一對方法可以實現批量處理數據。

不過值得注意的是,首先需要在數據庫鏈接中設置手動提交,connection.setAutoCommit(false),然后在執行Statement之后執行connection.commit()

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連接字符串中還可以加入參數,

rewriteBatchedStatements=true

mysql默認關閉了batch處理,通過此參數進行打開,這個參數可以重寫向數據庫提交的SQL語句

useServerPrepStmts=false

如果不開啟(useServerPrepStmts=false),使用com.mysql.jdbc.PreparedStatement進行本地SQL拼裝,最后送到db上就是已經替換了?后的最終SQL.

在此稍加改進,連接字符串中加入下面語句(代碼構造方法中去掉注釋):

connectStr += "?useServerPrepStmts=false&rewriteBatchedStatements=true";

再次測試結果如下:

數量=100001
運行時間=1213

同樣的數據量,這次執行只花費了12秒 ,由此可見處理效率大大提高,呵呵

以上所述是小編給大家介紹的Java使用JDBC向MySQL數據庫批次插入10W條數據測試效率,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 渭南市| 上饶县| 大港区| 揭西县| 改则县| 上杭县| 文安县| 敦化市| 太康县| 垦利县| 垫江县| 合山市| 苍山县| 名山县| 安徽省| 天气| 英德市| 井陉县| 大田县| 衡南县| 杂多县| 双城市| 常熟市| 德兴市| 漯河市| 宁明县| 巴东县| 大余县| 黔江区| 弋阳县| 左贡县| 苍山县| 永德县| 克山县| 滕州市| 巨野县| 和林格尔县| 武夷山市| 瓦房店市| 武川县| 曲靖市|