Самое быстрое «обновление» на jdbc с PreparedStatement и executeBatch - PullRequest
2 голосов
/ 03 февраля 2010

У меня есть Java-программа, которая в некоторых случаях должна обновлять большое количество записей в базе данных (например, 100 000).

Это происходит путем создания PreparedStatement и использования техники addBatch. Вот фрагмент:

connection.setAutoCommit(false);
PreparedStatement ps = connection.prepareStatement(
        "UPDATE myTable SET colName=? where id=?");

for (...) { // this loop can be 100000 long 
     colValue = ...
     id = ...
     ps.setString(1,colValue);
     ps.setString(2,id);
     ps.addBatch();
  }

ps.executeBatch();
connection.commit();

это лучший (самый быстрый) способ обновить 100000 записей в JDBC?

Кто-нибудь может предложить лучший способ?

Ответы [ 4 ]

2 голосов
/ 03 февраля 2010

Попробуйте это в качестве эталона:

  1. Используйте встроенные инструменты SQL для массового извлечения всей таблицы. Все ряды. Все столбцы.

  2. Удалить (или переименовать) таблицу.

  3. Используйте простое чтение / запись плоского файла, чтобы создать новый файл с примененными обновлениями.

  4. Используйте утилиту массовой загрузки, которая входит в вашу базу данных, чтобы восстановить всю таблицу из извлеченного файла.

  5. Добавление индексов после перезагрузки.

Вы можете обнаружить, что это быстрее, чем любое решение SQL. Мы прекратили использовать UPDATES для хранилища данных, поскольку извлечение -> процесс обработки плоских файлов -> загрузка была намного быстрее, чем SQL.

0 голосов
/ 30 апреля 2014

не использовать для цикличного использования.

public void Update(final List<Aclass> aclasss) {
 String sql = "UPDATE myTable SET colName=? where id=?";
GenericDAO.getJdbcTemplate().batchUpdate(sql, new BatchPreparedStatementSetter() {

    @Override
    public void setValues(PreparedStatement ps, int i) throws SQLException {
    Aclass aclass= aclasss.get(i);
                ps.setString(1,colValue);
                ps.setString(2,id);
            }

            @Override
            public int getBatchSize() {
                return aclasss.size();
            }
        });
    }
0 голосов
/ 03 февраля 2010

Поскольку пакетная обработка использует буферизацию на стороне клиента, а затем отправляет все как один запрос, может быть целесообразно выполнить пакеты с 5000 строк.Вы должны следить за потреблением памяти при добавлении 100 000 строк.

Иногда иногда происходит загрузка данных несколькими загрузками вместо одной загрузки (с использованием JDBC, по крайней мере, исходя из моего предыдущего опыта).

0 голосов
/ 03 февраля 2010

Вы должны использовать операции Spring Batch с JdbcTemplate

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...