Spring Batch для перехода с DB2 на SQL в пакетах ключей - PullRequest
0 голосов
/ 01 июня 2019

У меня есть таблица DB2 с 150 записями. У меня есть другая таблица SQL Server с такими же столбцами. Один из столбцов таблицы - назовем это кодом - является уникальным значением и индексируется. Я использую Spring Batch. Периодически я получаю файл со списком кодов. Например, файл с 5 К кодами. Для каждого кода в файле мне нужно прочитать записи из таблицы DB2, столбец кода которой соответствует коду в файле, и вставить несколько столбцов из этих записей в таблицу SQL Server. Я хочу использовать SQL, а не JPA и считаю, что существует ограничение (скажем, 1000) на то, сколько значений может быть в предложении SQL IN. Это мой размер куска?

Как должно быть разработано приложение Spring Batch для этого? Я рассмотрел следующие стратегии, но мне нужна помощь, чтобы решить, какая из них (или любая другая) лучше.

1) Одношаговое задание с читателем, читающим коды из файла, процессор, использующий JdbcTemplate для получения строк для фрагмента кодов, и писатель, записывающий строки с использованием JdbcBatchItemWriter - похоже, что JdbcTemplate будет иметь открытое соединение с БД в ходе выполнения задания.

2) JdbcPagingItemReader - документация Spring Batch предупреждает, что базы данных, такие как DB2, имеют стратегии пессимистичной блокировки, и предлагает вместо этого использовать управляющий запрос

3) Driving Query - есть ли пример? - Как процессор преобразует ключ в полный объект здесь? Как долго соединение остается открытым?

4) Сцепление читателей - возможно ли это? - первый читатель будет читать из файла, второй из DB2, а затем процессор и пишущий.

1 Ответ

0 голосов
/ 07 июня 2019

Я бы пошел с вашим вариантом № 1.Ваш файл, содержащий уникальные code s, фактически становится вашим запросом.

Ваш ItemReader будет читать файл и отправлять каждый code на ваш ItemProcessor.

ItemProcessor может либо напрямую использовать JdbcTemplate, либо вы можете делегировать отдельный объект доступа к данным (DAO) в вашем проекте, но в любом случае, при каждом вызове метода process aновая запись будет извлечена из таблицы базы данных DB2.Вы можете выполнить любую другую обработку, необходимую здесь, перед тем, как создать соответствующий объект для ItemWriter, который затем вставит или обновит необходимые записи в таблице базы данных SQL Server.

Вот пример из проектагде я использовал ItemReader<Integer> в качестве основного запроса для сбора идентификаторов устройств, на которых мне нужно было обрабатывать данные конфигурации.Затем я передал эти идентификационные данные на мой ItemProcessor, который имел дело с одним файлом конфигурации за раз:

public class DeviceConfigDataProcessor implements ItemProcessor<Integer,DeviceConfig> {

    @Autowired
    MyJdbcDao myJdbcDao;

    @Override
    public DeviceConfig process(Integer deviceId) throws Exception {

        DeviceConfig deviceConfig = myJdbcDao.getDeviceConfig( deviceId );
        // process deviceConfig as needed
        return deviceConfig;
    }
}

Вы бы обменяли deviceId на code и DeviceConfig для любого доменаобъект соответствует вашему проекту.

Если вы используете Spring Boot, у вас должно быть ConnectionPool автоматически, и ваш DAO будет извлекать одну запись за раз для обработки, так что вам не нужнобеспокоиться о постоянных подключениях к базе данных, пессимистических блокировках и т. д.

...