2017-02-14 109 views
0

我想批量插入20000條記錄,代碼自爆:甲骨文ojdbc則ExecuteBatch太慢

  while ((line = reader.readLine()) != null) { 
       line = line.substring(0, line.lastIndexOf(";")); 
       System.out.println(line); 
       st.addBatch(line); 

       i += 1; 
       if (i % 1000 == 0) { 
        System.out.println("execute:" + i); 
        Date beginBatch = new Date(); 
        st.executeBatch(); 
        Date endBatch = new Date(); 
        System.out.println("Start at: " + beginBatch); 
        System.out.println("End at: " + endBatch); 
       } 
      } 

,它tooks我一個小時完成,但是當我運行在SQL Developer控制檯這個SQL文件,它只花了我3分鐘。有什麼不對的嗎。有人能幫我找出根本原因。

+0

3分鐘20萬記錄非常慢。 – BobC

+0

如何提高性能? – user6807013

回答

-1

你永遠不會清理你的批處理。所以,很可能在第一次執行你EXEC 1000個報表,在第二屆2000等等...

你應該這樣做添加類似

   Date beginBatch = new Date(); 
       st.executeBatch(); 
       st.clearBatch(); 
+2

執行批處理應該在執行後清除批處理(即使不成功,雖然規範不是100%清楚)。 JDBC 4.2規範(第14.1.2節)說:_「一旦'executeBatch'返回,語句的批次就會重置爲空。」_ –

0

Oracle數據庫JDBC使用數組參數來實現JDBC批處理執行。沒有任何參數可以批量處理。您的批處理執行只是將語句排隊並逐個執行它們,而不是批處理。

即使數據庫必須對每個SQL執行一次硬解析,仍需要一個小時來執行20,000條SQL語句聽起來有點慢。由於SQLDev可以在3分鐘內完成相同的工作,所以JDBC應該執行相同的操作。最大的區別是配料。驅動程序批處理代碼不是免費的。它造成了大量的開銷。我建議您將addBatch調用替換爲執行調用。這可能會更快。