Java基礎知識(四)使用多線程插入數據


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();
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM