Перенос данных с Oracle на SQL Server с использованием весенней загрузки - PullRequest
0 голосов
/ 10 октября 2018

Ищу техническое решение;Чтобы запросить данные из одного БД и загрузить их в базу данных SQL Server с помощью весенней загрузки Java.

Ложный запрос для получения productNames, которые обновляются между заданным временем 20 часов:

SELECT 
    productName, updatedtime FROM
products WHERE
    updatedtime BETWEEN '2018-03-26 00:00:01' AND '2018-03-26 19:59:59';

Вот подход, которым мы следовали.

1) Это длительный запрос Oracle, который выполняется приблизительно в 1 час в рабочее время и возвращает ~ 1 миллион записей.

2) Мы должны вставить / вывести этот набор результатов в таблицу SQL Server с использованием JDBC.

3) Как я знаю, драйвер Oracle JDBC поддерживает потоковую передачу.Когда мы перебираем ResultSet, он загружает только строки fetchSize в память.

int currentRow = 1;
while (rs.next()) {
  // get your data from current row from Oracle database and accumulate in a batch
  if (currentRow++ % BATCH_SIZE == 0) {
    //insert whole accumulated batch into SqlServer database
  }
}

В этом случае нам не нужно хранить весь огромный набор данных из Oracle в памяти.И мы будем вставлять в SqlServer партиями BATCH_SIZE.Единственное, что нам нужно подумать, где делать коммит в базу данных SqlServer.

4) Здесь узким местом является время ожидания выполнения запроса для получения данных из oracle db, поэтому я планирую разделить запросна 10 равных частей, таких как каждый запрос, чтобы дать обновленное время между каждым часом, как показано.так что время выполнения также уменьшается до ~ 10 минут для каждого запроса.Например: ВЫБЕРИТЕ productName, updatedtime ИЗ продуктов, ГДЕ обновленное время МЕЖДУ '2018-03-26 01:00:01' И '2018-03-26 01:59:59';

5. Для этого мне потребовалось 5Соединения Oracle JDBC и 5 Sql-сервер (для запроса данных и вставки в БД) выполняют свою работу независимо.Я новичок в пуле соединений JDBC. Как я могу сделать пул соединений и закрыть соединение, если оно не используется и т.д.?

Пожалуйста, предложите, если у вас есть какой-либо другой лучший способ, чтобы получить данные из источника данных быстро в режиме реального времени.Пожалуйста, предложите.Заранее спасибо.

1 Ответ

0 голосов
/ 10 октября 2018

Это типичный вариант использования из весеннего пакета.

Там у вас есть понятие ItemReader (из вашей исходной базы данных) и ItemWriter (в вашу целевую базу данных).

Вы можете определить несколько источников данных, и у вас будут возможности для чтения с фиксированным размером выборки (например, JdbcCursorItemReader), а также для создания сетки для параллельного выполнения.

С помощью быстрого поиска вы можете найти многопримеры в Интернете, относящиеся к такого рода задачам.

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

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