Я рассматриваю три альтернативы, казалось бы, простой задаче обновления нескольких строк в таблице.Я хотел бы знать, какой из них лучше с точки зрения эффективности и читабельности кода.Хотя я не уверен, что есть четкий ответ на вопрос об эффективности, который может зависеть от используемой базы данных.
В моем конкретном случае я использую PostgresSQL в качестве базы данных, и рассматриваемая таблица содержит менее миллиона записей.У меня сейчас есть процесс, который отвечает за извлечение подмножества данных из этой таблицы, выполнение некоторой работы, а затем обновление этих строк с помощью отметки времени.
На мой взгляд, у меня есть три варианта:
Создание одного оператора обновления с помощью предложения in, содержимое которого будет заменено созданной строкой, содержащейидентификаторы строк для обновления.
String update = "update mytable set mydate = now() where id in (?)";
StringBuilder ids = new StringBuilder();
for (Item item : items) {
ids.append(item.getId()).append(",");
}
ids.setLength(ids.length() - 1);
update.replace("?", ids.toString());
ps = con.prepareStatement(update);
ps.executeUpdate();
Использовать партию
ps = con.prepareStatement("update mytable set mydate = now() where id = ?");
for (Item item : items) {
ps.setInt(1, item.getId());
ps.addBatch();
}
ps.executeBatch();
Использовать транзакцию
con.setAutoCommit(false);
ps = con.prepareStatement("update mytable set mydate = now() where id = ?");
for(Item item : items) {
ps.setInt(1, item.getId());
ps.executeUpdate();
}
con.commit();
Что из этого будет считаться наилучшей практикой?Или есть другой способ предложить?Лично мне нравится второй вариант, он лаконичен и легок в подготовке, но мне кажется, что вариант номер один будет наиболее эффективным.