2010-08-08 3 views
5

Каков наилучший/наиболее эффективный способ вставки 1000 строк в одну таблицу (база данных jdbc/connector-mysql)? (это буфер и необходимо сбрасывать в базу данных каждый раз, когда он заполнен)Эффективная множественная вставка SQL

1- Один автогенерированный/контактированный оператор SQL?

2- for (int i = 0; i<1000; i++) { con.prepareStatement(s.get(i)); } con.commit();

3- хранимой процедуры?

4- объемная вставка данных через файл?

5- (ваше решение)

ответ

2

The LOAD DATA INFILE statement, вероятно, ваш лучший выбор для исполнения. (# 4 из вашего списка выше). Хотя для выполнения вашей задачи, вероятно, потребуется больше кода, так как вам нужно создать промежуточный файл, получить его на сервере, а затем вызвать LOAD DATA, чтобы получить его в свой db.

MySql Страницы справки цитирую:

Оператор DATA INFILE НАГРУЗКИ читает строки из текстового файла в таблицу в очень высокой скорости.

+0

Используйте этот подход с осторожностью. Я видел системы, которые делали это в прошлом, и затраты на создание промежуточного файла и доставку его на сервер перевешивали преимущества производительности при использовании быстрой загрузки файлов. –

+0

Это выглядит очень опасно, так как у нас есть два сервера приложений, которые одновременно обращаются к одной и той же базе данных. Я действительно боялся этого ответа. Спасибо всем за ваш ответ. –

0

Вы можете использовать JDBC пакетные вставки.

PreparedStatement ps = cn.prepareStatement("INSERT INTO...."); 

for (int i = 0; i < 1000; i++) { 
    ps.setString(1, "value-" + i); // Set values 
    ps.addBatch();     // Add this to the batch 
    ps.clearParameters();   // Reset the parameters 
} 

ps.executeBatch(); 

Однако MySQL не поддерживает функциональные возможности пакетной вставки изначально, поэтому, чтобы получить разумную производительность, вам необходимо добавить rewriteBatchedStatements=true в конфигурацию JDBC для MySQL.

Существует также определенный в MySQL синтаксис пакетной вставки, который можно использовать, если вы хотите создать большую строку SQL. Я бы попробовал оба и проверить производительность.

INSERT INTO x (a,b) 
    VALUES ('1', 'one'), 
      ('2', 'two'), 
      ('3', 'three'); 

Будьте осторожны с обоими подходами, так как вы можете превысить максимальный размер пакета для одного запроса. Вам может потребоваться установить размер партии, который отличается от количества записей в вашем буфере. Например. вам может потребоваться разбить 1000 записей по 10 партий по 100.

0

Обратите внимание, что JDBC автоматически фиксирует после каждого утверждения, если вы явно не говорите ему об этом. Выполняя это и запуская X-вставки перед запуском commit, вы должны немного улучшить свою производительность.

+0

Я забыл написать, что я использовал c3p0. поэтому я должен зафиксировать в конце. –

Смежные вопросы