Java JDBC clearBatch () и куча памяти - PullRequest
5 голосов
/ 26 января 2010

Я заметил следующее поведение.

У меня есть файл размером около 3 МБ, содержащий несколько тысяч строк. В строках я разделяю и создаю подготовленную выписку (около 250 000 выписок).

Что я делаю:

preparedStatement
addBatch
do for every 200 rows {
 executeBatch
 clearBatch().
}

в конце

commit()

Использование памяти увеличится примерно до 70 МБ без ошибки нехватки памяти. Возможно ли снизить использование памяти? и иметь транзакционное поведение (если один терпит неудачу, все терпит неудачу.). Мне удалось уменьшить объем памяти, выполнив коммит с executeBatch и clearBatch ... но это приведет к частичной вставке всего набора.

Ответы [ 2 ]

2 голосов
/ 26 января 2010

Вы можете вставить все строки во временную таблицу с одинаковой структурой и, если все в порядке. позвольте базе данных вставить их в целевую таблицу, используя: insert into target (select * from temp). В случае сбоя импорта в временную таблицу вы ничего не изменили в целевой таблице.

РЕДАКТИРОВАТЬ: фиксированный синтаксис

0 голосов
/ 26 января 2010

Вы также можете использовать функцию «пакетной обработки» JDBC 2.0.

  1. Установите соединение с помощью connection.setAutoCommit(false)
  2. Добавьте пакеты к своему заявлению, используя statement.addBatch(sql_text_here)
  3. Как только все ваши партии загружены, выполните его, используя: statement.executeBatch()
  4. Зафиксируйте его, используя connection.commit()
  5. Перехват исключений и откат при необходимости с помощью connection.rollback()

Подробнее об обработке исключений для отката ... вот типичный обработчик исключений отката:

  catch( BatchUpdateException bue )
  {
    bError = true;
    aiupdateCounts = bue.getUpdateCounts();

    SQLException SQLe = bue;
    while( SQLe != null)
    {
      // do exception stuff

      SQLe = SQLe.getNextException();
    }
  } // end BatchUpdateException catch
  catch( SQLException SQLe )
  {
    ...

  } // end SQLException catch

Читайте здесь: http://java.sun.com/developer/onlineTraining/Database/JDBC20Intro/JDBC20.html#JDBC2015

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