2017-08-25 106 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块中关闭您的资源。