【问题标题】:How to transfer big data to mysql (JDBC) quickly?如何快速将大数据传输到mysql(JDBC)?
【发布时间】:2017-08-25 22:26:02
【问题描述】:

我有一个代码,它管理ArrayList<priceItem> 并使用preparedStatement 将每个项目引导到MySQL。我不知道如何提高这段代码的速度。我尝试使用.addBatch(),但没有帮助。这是代码。

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 分钟以上。我需要发送超过 15 万件物品。

【问题讨论】:

  • 您必须使用 JDBC 还是直接访问数据库服务器?如果您有像 csv 这样的文件,将批次插入数据库可能会快得多
  • 检查 addBatch() 的文档。你这样做的方式看起来不对。您也可以查看网络上的批处理教程。解决这些类型的问题将需要备份并从已知的开始并工作到未知。所以很难有人来帮助你。
  • 另外,您应该清楚这是一次性操作,还是典型的常规数据集移动。这会对架构、索引等产生影响。
  • 现在我正在使用 JDBC 并连接到本地主机,但将来我想在站点上重新定位 db。我使用 ApachePoi 提取 excel 数据并将其转换为数组列表
  • MySQL 可以直接加载 CSV 数据。根本不需要涉及 JDBC 或 Java。你为什么要测试连接是否在不可能关闭的地方关闭,为什么要打印它不是关闭的?

标签: java mysql jdbc arraylist prepared-statement


【解决方案1】:

许多改进此代码的方法:

  1. 创建更小的批次以减少网络延迟。
  2. 使用事务管理器并提交批处理。您的回滚段不应与总事务一样大。
  3. 在 finally 块中关闭您的资源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-06
    • 2019-07-07
    • 2018-10-13
    • 2023-02-05
    • 1970-01-01
    • 2017-07-22
    • 2015-11-03
    • 2021-07-23
    相关资源
    最近更新 更多