Создание пакетных обновлений SQL из Java
Я хочу обновить каждую строку в определенном столбце в базе данных mySql. В настоящее время я использую java.sql.PreparedStatement
для каждой строки и повторения в цикле for. Мне было интересно, есть ли какие-либо другие альтернативы с точки зрения программирования на Java, чтобы сделать это менее затратным по времени и ресурсам (что-то вроде выполнения подготовленных операторов в пакете). Обновления сделаны из кода Java, потому что именно здесь я получаю значения. Я также не заинтересован в создании хранимых процедур на сервере, так как у меня нет на это прав.
2 ответа
Вот ссылка на пример, который использует подготовленный оператор Java для выполнения пакетного обновления. Я также включил образец с сайта для быстрого ознакомления.
http://www.exampledepot.com/egs/java.sql/BatchUpdate.html
try {
// Disable auto-commit
connection.setAutoCommit(false);
// Create a prepared statement
String sql = "INSERT INTO my_table VALUES(?)";
PreparedStatement pstmt = connection.prepareStatement(sql);
// Insert 10 rows of data
for (int i=0; i<10; i++) {
pstmt.setString(1, ""+i);
pstmt.addBatch();
}
// Execute the batch
int [] updateCounts = pstmt.executeBatch();
// All statements were successfully executed.
// updateCounts contains one element for each batched statement.
// updateCounts[i] contains the number of rows affected by that statement.
processUpdateCounts(updateCounts);
// Since there were no errors, commit
connection.commit();
} catch (BatchUpdateException e) {
// Not all of the statements were successfully executed
int[] updateCounts = e.getUpdateCounts();
// Some databases will continue to execute after one fails.
// If so, updateCounts.length will equal the number of batched statements.
// If not, updateCounts.length will equal the number of successfully executed statements
processUpdateCounts(updateCounts);
// Either commit the successfully executed statements or rollback the entire batch
connection.rollback();
} catch (SQLException e) {
}
public static void processUpdateCounts(int[] updateCounts) {
for (int i=0; i<updateCounts.length; i++) {
if (updateCounts[i] >= 0) {
// Successfully executed; the number represents number of affected rows
} else if (updateCounts[i] == Statement.SUCCESS_NO_INFO) {
// Successfully executed; number of affected rows not available
} else if (updateCounts[i] == Statement.EXECUTE_FAILED) {
// Failed to execute
}
}
}
Если вы используете MySQL, я считаю, что краткий ответ на ваш вопрос "Нет". Ты ничего не сможешь сделать, это будет быстрее.
Действительно, даже подготовленное заявление ничего не даст вам. Возможно, это изменилось в более новых версиях, но в последний раз, когда я проверял (несколько лет назад), MySQL в любом случае просто превращает подготовленные операторы в регулярные. Ничего не кешируется.