Я бы выделил обработку подготовленных операторов хотя бы для метода. В этом случае из-за отсутствия результатов это довольно просто (и при условии, что соединение является переменной экземпляра, которая не изменяется):
private PreparedStatement updateSales;
public void updateSales(int sales, String cof_name) throws SQLException {
if (updateSales == null) {
updateSales = con.prepareStatement(
"UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ?");
}
updateSales.setInt(1, sales);
updateSales.setString(2, cof_name);
updateSales.executeUpdate();
}
В этот момент это просто вопрос вызова:
updateSales(75, "Colombian");
Что довольно просто интегрировать с другими вещами, да? И если вы будете вызывать метод много раз, обновление будет построено только один раз, и это значительно ускорит процесс. Ну, если предположить, что вы не делаете сумасшедших вещей, как, например, каждое обновление в отдельной транзакции ...
Обратите внимание, что типы являются фиксированными. Это связано с тем, что для любого конкретного запроса / обновления они должны быть исправлены, чтобы база данных могла эффективно выполнять свою работу. Если вы просто извлекаете произвольные строки из файла CSV, передайте их как строки. Там также нет блокировки; гораздо лучше вместо этого использовать отдельные соединения из одного потока.