В основном это парень из БД, который не использовал Java для массовой загрузки и т. Д., Как это было сделано с помощью инструментов ETL или внутренних инструментов БД.
Но если я правильно понимаю, инструменты написаны на Java / C ++ и т. Д., И они используют JDBC, ODBC для реализации операции.
Недавно в одном проекте пытались загрузить объемные данные с использованием JDBC и наблюдали следующее.
у нас есть миллион записей, 1,5 ГБ данных, таблица с 360 столбцами.
Чтение из таблицы A и попытка вставить ее в целевую таблицу с интервалом 5 тыс. Записей. исходная цель и цель - Oracle.
В проекте используется Spring JDBC. Я использовал здесь простой JDBC для тестирования в одиночку и устранения проблем с производительностью.
логика описана на псевдоязыке.
prepare statement for Target with
"insert into target values ( ?,?, .. 368 columns);
rs = ( select * from table a );
while rs.next {
stmt.setstring(1, rs.getString("column1");
.
.
360 columns.
stmt.add_batch();
if 5K records then executeBatch();
}
Основной выпуск:
для каждых 5K-записей набор операторов занимает более 1 минуты.
, поэтому загрузка всего 1,5 Гб или 1 млн. Записей займет ок. 4 часа.
Я делаю это одним потоком, но чувствую, что громкость очень низкая.
Есть ли лучший способ реализовать это?
Как инструменты ETL говорят, что informatica и т. Д. Реализуются внутренне?
Другая проблема заключается в следующем: иногда executeBatch()
для некоторой таблицы с аналогичным количеством столбцов и большим объемом в каждой записи записывать 5 тыс. Записей за один раз. В некоторых случаях он записывает 100 записей за один раз, хотя executeBatch
- после 5 тыс. Строк, и запись также занимает вечность для 1 миллиона записей.
Еще одна вещь вместо набора результатов, если я использую операторы set как
for (I=1 ,I<=1000000; I++)
stmt.setstring(1, rs.getString("123456789");--hardcode value
.
.
360 columns.
stmt.add_batch();
if 5K records then executeBatch();
}
затем требуется около 4 секунд для привязки каждые 5k и 2-3 секунды до executeBatch()
. Таким образом, за 20 минут я могу загрузить 1 миллион около 6-7 ГБ данных.