大量資料情況下單執行緒插入和多執行緒insert資料庫的效能測試
阿新 • • 發佈:2019-01-01
之前一直沒有遇到過大批量資料入庫的場景,所以一直沒有思考過在大量資料的情況下單執行緒插入和多執行緒插入的效能情況。今天在看一個專案原始碼的時候發現使用了多執行緒insert操作。
於是簡單的寫了一個測試程式來測試一批資料在N個執行緒下的insert情況。
public class ThreadImport { private String url="jdbc:oracle:thin:@localhost:1521:orcl"; private String user="cmis"; private String password="cmis"; public Connection getConnect(){ Connection con = null; try { Class.forName("oracle.jdbc.driver.OracleDriver"); con=DriverManager.getConnection(url, user, password); } catch (Exception e) { e.printStackTrace(); } return con; } public void multiThreadImport( final int ThreadNum){ final CountDownLatch cdl= new CountDownLatch(ThreadNum); long starttime=System.currentTimeMillis(); for(int k=1;k<=ThreadNum;k++){ new Thread(new Runnable() { @Override public void run() { Connection con=getConnect(); try { Statement st=con.createStatement(); for(int i=1;i<=80000/ThreadNum;i++){ String uuid=UUID.randomUUID().toString(); st.addBatch("insert into demo_table(a,b) values('"+uuid+"','"+uuid+"')"); if(i%500==0){ st.executeBatch(); } } cdl.countDown(); } catch (Exception e) { }finally{ try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } }).start(); } try { cdl.await(); long spendtime=System.currentTimeMillis()-starttime; System.out.println( ThreadNum+"個執行緒花費時間:"+spendtime); } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) throws Exception { ThreadImport ti=new ThreadImport(); ti.multiThreadImport(1); ti.multiThreadImport(5); ti.multiThreadImport(8); ti.multiThreadImport(10); ti.multiThreadImport(20); ti.multiThreadImport(40); System.out.println("筆記本CPU數:"+Runtime.getRuntime().availableProcessors()); } }
執行結果:
1個執行緒花費時間:56707 5個執行緒花費時間:21688 8個執行緒花費時間:16625 10個執行緒花費時間:16098 20個執行緒花費時間:19882 40個執行緒花費時間:23536 筆記本CPU數:8
發現在一定數量的執行緒下效能提升的還是很明顯。
在實際的專案中,使用了連線池的情況下,多執行緒(在一定範圍內)資料插入的效能還要明顯一點。