import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.util.UUID; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class test_20191010 { public static void main(String... arg) { BatchInsert bi = new BatchInsert(); //bi.exec();//自動分配需要線程 耗時80s //bi.exec(1);//使用單線程 耗時288s bi.exec(10);//手動分配需要線程 耗時81s } } class BatchInsert { private final String url = "jdbc:mysql://localhost:3306/test"; private final String user = "root"; private final String pwd = "root"; private final int dataSize = 1000000;//插入數據數量 private final int dataUnit = 10000;//1個線程處理數據數量 private Connection getConn() { Connection conn = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(url,user,pwd); }catch(Exception e) { e.printStackTrace(); } return conn; } public void exec() { final int threadNum = dataSize/dataUnit + 1; exec(threadNum); } public void exec(final int threadNum) { ExecutorService excutor = Executors.newFixedThreadPool(threadNum); //使用線程池 final CountDownLatch cdl = new CountDownLatch(threadNum);//使用計數器 long st = System.currentTimeMillis(); for(int k=1;k<=threadNum;k++) { final int p = k; excutor.execute(new Thread(new Runnable() { @Override public void run() { Connection con = getConn(); try { con.setAutoCommit(false);//關閉自動提交 Statement st = con.createStatement(); for(int i=1;i<=dataSize/threadNum;i++) { String uuid = UUID.randomUUID().toString(); st.addBatch("insert into test select '"+ uuid +"'"); if (threadNum==1) { //System.out.println("單線程插入"+uuid); if (i%dataSize==0) { st.executeBatch(); System.out.println("單線程批量提交"+i+"條"); } }else { //System.out.println("線程"+p+"插入"+uuid); if (i%(dataSize/threadNum)==0) { st.executeBatch(); System.out.println("線程"+p+"批量提交"+i+"條"); } } } cdl.countDown();//計數器減一 con.commit(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { con.close(); }catch(SQLException e) { e.printStackTrace(); } } } })); } excutor.shutdown();//關閉線程池 try { cdl.await();//線程等待 long ut = System.currentTimeMillis() -st; System.out.println(threadNum+"個線程總共耗費時間"+ut/1000+"s("+ut+"ms)"); }catch(InterruptedException e) { e.printStackTrace(); } } }