gpt4 book ai didi

java - 使用 JAVA 从 CSV 更新 MySQL

转载 作者:可可西里 更新时间:2023-11-01 07:34:10 24 4
gpt4 key购买 nike

我的问题如下:

  1. CSV 文件按给定时间间隔从服务器下载。

  2. 必须解析文件(必须删除不必要的空格)。

  3. 必须为每个条形码更新商品价格、rrp 和库存数量。

每个 CSV 行包含商品编号、产品标题、仓库 ID、仓库名称、价格、rrp 价格、库存和条形码。 items 表包含大约 71000 行。并且条码在数据库中不是唯一键(因为具有相同条码的项目可以在不同的仓库中)。问题是在本地主机 MySQL 服务器上更新需要一个多小时(到 SQLite 大约需要半小时)。有什么方法可以优化 SQL 查询以加快速度吗?我当前的代码如下所示:

    public void updateData (BufferedReader bufferedReader, Connection sqlConnection){
String csvLine = null;
PreparedStatement preparedStatement = null;
String sqlString = "UPDATE items SET price = ?, rrp = ?, stock = ? WHERE departmentid = ? AND barcode = ?";
try {
preparedStatement = sqlConnection.prepareStatement(sqlString);
while ((csvLine = bufferedReader.readLine()) != null) {
String[] splitLine = csvLine.split(";");
preparedStatement.setBigDecimal(1, new BigDecimal(splitLine[4].trim()).setScale(2, RoundingMode.CEILING));
preparedStatement.setBigDecimal(2, new BigDecimal(splitLine[5].trim()).setScale(2, RoundingMode.CEILING));
preparedStatement.setInt(3, Integer.parseInt(splitLine[6].trim()));
preparedStatement.setString(4, splitLine[2].trim());
preparedStatement.setString(5, splitLine[8].trim());
preparedStatement.executeUpdate();
}
} catch (IOException | SQLException exc) {
System.out.println(exc.getMessage());
} finally {
try {
sqlConnection.commit();
preparedStatement.close();
sqlConnection.close();
} catch (SQLException exc) {
exc.printStackTrace();
}
}
}

到目前为止最快的解决方案看起来像@e4c5 所建议的那样,将 csv 数据加载到临时表并使用查询:更新项目 INNER JOIN temp_table ON items.barcode = temp_table.barcode SET items.rrp = temp_table.rrp, items.price = temp_table.price, items.stock = temp_table.stock WHERE items.barcode = temp_table.barcode AND items .departmentid = temp_table.departmentid. 有什么方法可以让它更快吗?

最佳答案

有一种无需一行 Java 代码即可更快、更好地导入数据的方法。那就是 LOAD DATA INFILE

请注意,LOAD DATA 可以对您的 CSV 文件进行一些预处理。然而,它在某些情况下是不够的。然后您将不得不从 java 获得帮助,但 java 不应该执行插入操作。

您的 Java 代码应该预处理 CSV 并生成另一个可以传递给 LOAD DATA 的 CSV。 70000 条记录轻而易举。

LOAD DATA 不支持 ON DUPLICATE KEY UPDATE 语法。但它确实有 REPLACE 语法(比重复键更新稍微慢一些,但它仍然比 java 或任何其他编程语言可以提供的快至少一个数量级)。

如果进行实际更新很重要。 LOAD DATA 到一个临时表然后到

INSERT INTO mytable SELECT * FROM temp_table ON DUPLICATE KEY ....

关于java - 使用 JAVA 从 CSV 更新 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43778755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com