#java #jdbc #autocommit
Вопрос:
Как я могу заставить свое приложение выполнять изменения в базе данных только в конце цикла while?
У меня есть этот метод отката, но я только внесу изменения в базу данных в конце из-за несогласованной обработки данных
Я попытался установить автоматическую фиксацию в значение false, но, несмотря на то, что исключение было вызвано на второй итерации цикла while, изменения все еще были в базе данных(до момента, предшествовавшего прерыванию, таблицы после этого не претерпевали изменений).
Я делаю что-то не так?
@Override
public void rollback(Database database) throws CustomChangeException {
JdbcConnection connection = (JdbcConnection) database.getConnection();
try {
connection.setAutoCommit(false);
ResultSet rs = getTables(connection);
//if the user chose to use a suffix
if (this.getSuffix() != null) {
while (rs.next()) {
String tableName = rs.getString(3);
if (tableName.endsWith(this.getSuffix())) {
if (!checkColumnsExists(connection, tableName, newName)) {
throw new CustomChangeException("The column " newName " doesn't exist in the table " tableName " anymore.Please fix this");
}
PreparedStatement s = connection.prepareStatement(getRollbackQuery(tableName));
s.executeUpdate();
logger.info("Column name reversed to " this.getColumnName() " in table" tableName);
}
}
}
//if the user chose to use a regex
if (this.getRegex() != null) {
Pattern pattern = Pattern.compile(this.getRegex());
while (rs.next()) {
String tableName = rs.getString(3);
Matcher matcher = pattern.matcher(tableName);
boolean matches = matcher.matches();
if (matches) {
if (!checkColumnsExists(connection, tableName, newName)) {
logger.error("The column " newName " doesn't exist in the table " tableName " anymore.Please fix this");
throw new CustomChangeException();
}
PreparedStatement s = connection.prepareStatement(getRollbackQuery(tableName));
s.executeUpdate();
logger.info("Column name reversed to " this.getColumnName() " in table" tableName);
}
}
}
connection.commit();
} catch (SQLException | DatabaseException | DifferentDataTypeException e) {
logger.error(e.getMessage());
throw new CustomChangeException();
}
}
Комментарии:
1. чтобы обновить таблицу в конце цикла while, вам нужно переместить эти строки из цикла while
PreparedStatement s = connection.prepareStatement(getRollbackQuery(tableName)); s.executeUpdate();
2. @sanjeevRm но таким образом, как я могу обновить несколько таблиц? Это приведет только к обновлению последней таблицы цикла while
3. @sanjeevRm нет ли способа «добавить» запросы в очередь и выполнить их все в конце цикла?
4. затем вам следует найти statement.addBatch (), в который вы можете добавлять запросы для выполнения, а затем запустить statement.executeBatch()
5. попробую это сделать. Я смотрел на setSavePoint и откат, но я не думаю, что это сработает