本文完全照搬別人的。
原文標題:Java實現數據批量導入數據庫(優化速度-2種方法)
原文地址:https://blog.csdn.net/qy20115549/article/details/52699724
原文看着更清晰,請移步原文查看。
連接數據庫
package db; import java.sql.Connection; import java.sql.DriverManager; /* * 合肥工業大學 管理學院 qianyang 1563178220@qq.com */ public class MySQLConnections { private String driver = ""; private String dbURL = ""; private String user = ""; private String password = ""; private static MySQLConnections connection = null; private MySQLConnections() throws Exception { driver = "com.mysql.jdbc.Driver"; dbURL = "jdbc:mysql://127.0.0.1:3306/test"; user = "root"; password = "112233"; System.out.println("dbURL:" + dbURL); } public static Connection getConnection() { Connection conn = null; if (connection == null) { try { connection = new MySQLConnections(); } catch (Exception e) { e.printStackTrace(); return null; } } try { Class.forName(connection.driver); conn = DriverManager.getConnection(connection.dbURL, connection.user, connection.password); } catch (Exception e) { e.printStackTrace(); } return conn; } }
批量處理的兩種方式
第一種方式,是每5000條記錄放入數據庫,一次。也就是每次提交的記錄都有5000條,當然最后一次可能不是。另外,一種方式,是使用默認的提交方式。兩者的處理速度都不錯。50000條記錄,大概15秒左右。
package db; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; /* * 合肥工業大學 管理學院 qianyang 1563178220@qq.com */ public class MySQLUpdate { static Connection con = MySQLConnections.getConnection(); static PreparedStatement stmt = null; public static int executeInsert() throws SQLException { int i = 0; //設置批量處理的數量 int batchSize = 5000; stmt = con.prepareStatement("insert into mysqltest (id,name) " + "values (?,?)"); // 關閉事務自動提交 ,這一行必須加上 con.setAutoCommit(false); for (int j = 0; j < 50005; j++){ ++i; stmt.setInt(1, j); stmt.setString(2, "name"); stmt.addBatch(); if ( i % batchSize == 0 ) { stmt.executeBatch(); con.commit(); } } if ( i % batchSize != 0 ) { stmt.executeBatch(); con.commit(); } return i; } public static void executeInsert2() throws SQLException { // 關閉事務自動提交 ,這一行必須加上 con.setAutoCommit(false); stmt = con.prepareStatement("insert into mysqltest1 (id,name) " + "values (?,?)"); for (int j = 0; j < 50002; j++){ stmt.setInt(1, j); stmt.setString(2, "name"); stmt.addBatch(); } stmt.executeBatch(); con.commit(); stmt.close(); con.close(); } }
main方法
package main; import java.sql.SQLException; import db.MySQLUpdate; /* * 合肥工業大學 管理學院 qianyang 1563178220@qq.com */ public class Test { public static void main(String[] args) throws SQLException { // long begin1 = System.currentTimeMillis(); // MySQLUpdate.executeInsert(); // long end1 = System.currentTimeMillis(); // System.out.println("程序運行時間為:"+(end1-begin1)); long begin2 = System.currentTimeMillis(); MySQLUpdate.executeInsert1(); long end2 = System.currentTimeMillis(); System.out.println("程序運行時間為:"+(end2-begin2)); } }