Atualize o MySQL do CSV usando JAVA
meu problema é o seguinte:
O arquivo CSV é baixado em intervalos determinados do servidor.
O arquivo deve ser analisado (há espaços desnecessários que precisam ser removidos).
O preço do item, o rrp e a quantidade do estoque devem ser atualizados para cada código de barras.
Cada linha CSV contém o número do artigo, o título do produto, o ID do depósito, o nome do depósito, o preço, o preço de rrp, o estoque e o código de barras. A tabela de itens contém cerca de 71000 linhas. E o código de barras não é uma chave exclusiva no banco de dados (porque o item com o mesmo código de barras pode estar em armazéns diferentes). O problema é que leva mais de uma hora para atualizar no servidor localhost do MySQL (cerca de meia hora para o SQLite). Existe alguma maneira de otimizar a consulta SQL para tornar as coisas mais rápidas? Meu código atual é assim:
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();
}
}
}
Até agora, a solução mais rápida parece sugerida por @ e4c5 com dados LOAD csv para tabela temporária e usando a consulta:UPDATE items 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.
Alguma maneira de tornar isso ainda mais rápido?