Вы можете использовать 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.
Используйте этот подход с осторожностью. Я видел системы, которые делали это в прошлом, и затраты на создание промежуточного файла и доставку его на сервер перевешивали преимущества производительности при использовании быстрой загрузки файлов. –
Это выглядит очень опасно, так как у нас есть два сервера приложений, которые одновременно обращаются к одной и той же базе данных. Я действительно боялся этого ответа. Спасибо всем за ваш ответ. –