2017-08-25 29 views
0

我有一個代碼,它使用preparedStatement管理ArrayList並將每個項目導入到mySQL中,但我不知道如何提高此代碼的速度。我嘗試使用.addBatch(),但它沒有幫助。這是代碼。如何快速將大數據傳輸到MySQL(JDBC)?

try { 
      connection = DriverManager.getConnection(URL, USERNAME, PASSWORD); 
      preparetStmt = connection.prepareStatement(INSERT_NEW); 
      for (int i = 0; i < priceItems.size(); i++) { 
       preparetStmt.setString(1, priceItems.get(i).getName()); 
       preparetStmt.setString(2, priceItems.get(i).getQuantity()); 
       preparetStmt.setString(3, priceItems.get(i).getCost()); 
       preparetStmt.setString(4, priceItems.get(i).getAnnotation()); 
       preparetStmt.addBatch(); 
      } 
      preparetStmt.executeBatch(); 


      if (!connection.isClosed()) { 

       System.out.print("DB is closed."); 

      } 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 

幫助我找到方法來提高加載速度加載此語句。 1500件物品需要2分鐘以上,我需要發送超過150K件物品。

+1

您是否必須使用JDBC或者您是否直接訪問數據庫服務器?如果你有一個像csv這樣的文件,可以將批量插入數據庫的速度要快很多 – Noob

+0

檢查addBatch()的文檔。你這樣做的方式看起來不對。網上還有批處理教程,您也可以查看。解決這些問題需要從已知的和未知的工作中支持和開始。所以很難讓人來幫助你。 – jdv

+0

此外,您應該清楚這是一次性操作,還是這將是典型的常規數據集移動。這會影響模式,索引等。 – jdv

回答

1

很多方法來改善這個代碼:

  1. 創建小批量,所以你在網絡延遲降低。
  2. 使用事務管理器並提交批處理。您的回滾段不應該和總交易一樣大。
  3. 在finally塊中關閉您的資源。