2016-07-01 3 views
2

Я пытаюсь вставить 1 миллион записей в таблицу DB.Как вставить миллионы данных в базу данных

Я хочу создать по крайней мере 3 потока, каждый из которых запускает одну вставку, тогда мы можем получить 3 параллельных запроса в каждой секунде. Мы можем управлять запуском вставок, чтобы они происходили точно в одно и то же время, заставляя каждый поток ждать и просыпаться вместе с тем же прерыванием. Затем каждый поток переходит в спящий режим, пока не истечет это 1-секундное окно. Затем весь процесс будет повторяться. как я могу это сделать?

Любое предложение или советы помогут.

+1

Есть ли какая-то особая причина, по которой вы хотите создать 3 темы? Диск IO является узким местом скорости вставки данных в БД. Создание большего количества потоков не помогает эффективности. –

+1

может представлять интерес для всего бита «вставки большого количества данных» http://stackoverflow.com/questions/7681771/insert-large-amount-of-data-efficiently-with-sql – Terminus

+1

* Мы можем контролировать стрельбу из вставок произойдет точно в одно и то же время * Нет, вы не можете. – shmosel

ответ

2

Вставка большого количества данных считается плохой практикой. Вставить большой объем данных потребуется много времени, в то время как вы можете загружать данные в таблицу напрямую с помощью sqlloader или аналогичного инструмента. Эти загрузчики работают быстрее, так как они не будут налагать на себя накладные расходы на управление транзакциями.

Вот некоторые вопросы, которые я задаю себе, когда у меня есть огромные данные для загрузки в базу данных.

  1. Является ли эта ссылка/статические данные (например, страны, города, банки)
  2. Является ли это динамические данные, полученные с помощью приложения/сгенерированные с использованием приложения (например, счета, журналы вызовов, оплаты, счета деятельности).

В большинстве случаев это случай 1, в этом случае предпочтительнее использовать sqlloader.

Другие случаи (2) могут возникнуть из-за миграции/обновления данных, в этом случае предпочтительным является также sqlloader.

Основываясь на приведенном выше объяснении. Вы можете лучше описать свою проблему или выбрать sqlloader.

1

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

1) принять SQL дамп данных, если его из старой базы данных и импорта в новую базу данных, которая является супер быстрый

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

3) Если вы использовали некоторые инструменты пользовательского интерфейса управления базами данных, они также разрешили вам импортировать CSV или преуспеть, что также быстро, что поможет вам, если у вас есть данные в файлах.

много других способов, но один из выше трех приспособит для вас ..

1

Я всегда использовал sqlloader или SQLDeveloper для загрузки больших объемов данных. Это имеет смысл, приложение java для вставки данных имеет смысл, когда у нас есть дельта. Но в первую очередь лучше всего настроить/перенаправить загрузку данных/подобный вариант sql.

2

Это быстрый пример пакетной вставки на основе mykong коды из .. http://www.mkyong.com/jdbc/jdbc-preparedstatement-example-batch-update/

В основном это дает скорость sqlloader, которая делает пакетные вставки. И нужно использовать только 1 нить.

То, что я сделал здесь поместить вставки в петлю, чтобы показать, что вам нужно очистить партию каждые несколько тысяч записей ..

Вы бы удалить бесконечный цикл и он вставить данные вместо жесткого закодирована mkyong data

String insertTableSQL = "INSERT INTO DBUSER" 
     + "(USER_ID, USERNAME, CREATED_BY, CREATED_DATE) VALUES" 
     + "(?,?,?,?)"; 

PreparedStatement preparedStatement = dbConnection.prepareStatement(insertTableSQL); 
try { 
    dbConnection.setAutoCommit(false); 

    int batchTotal=0; 
    for (;;) { // infinate loop? change this to get your data here 
     preparedStatement.setInt(1, 101); 
     preparedStatement.setString(2, "mkyong101"); 
     preparedStatement.setString(3, "system"); 
     preparedStatement.setTimestamp(4, getCurrentTimeStamp()); 
     preparedStatement.addBatch(); 
     if (batchTotal++ == 4096) { 
      int[] result = preparedStatement.executeBatch(); 
      preparedStatement.clearBatch(); 
      batchTotal=0;      
     } 
    } 
    if (batchTotal > 0) { 
     int[] result = preparedStatement.executeBatch(); 
    } 

    dbConnection.commit(); 
} finally { 
    preparedStatement.close(); 
} 
Смежные вопросы