Как выполнять обновления базы данных только в конце цикла while

#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 и откат, но я не думаю, что это сработает