Как вставить массовые записи после модификации в другую таблицу, используя Apache Camel и Spring boot - PullRequest
0 голосов
/ 03 апреля 2019

Я использую Apache Camel и Spring Boot для реализации процесса интеграции между двумя таблицами. Исходная таблица включает в себя более 1000 записей. Что я хочу сделать, так это после внесения некоторых изменений в исходные данные, эти данные должны быть вставлены в другую таблицу в той же базе данных. Я застрял на этапе вставки данных.

    <camelContext id="Integrator" xmlns="http://camel.apache.org/schema/spring">
        <route id="hello">
            <from id="timer" uri="timer:test?period={{timer.period}}"/>
            <setBody id="query">
                <constant>SELECT * FROM abc WHERE code = 'MDV1'</constant>
            </setBody>
            <log id="log_1" message="log msg"/>
            <to id="jdbc_con" uri="jdbc:dataSource"/>
            <process id="changebody" ref="editPayload"/>
            <log id="log_2" message="process row ${body}"/>
        </route>
    </camelContext>

Обновлено:

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

<camelContext id="Integrator"
        xmlns="http://camel.apache.org/schema/spring">
        <route id="data_transfer">
            <from id="timer" uri="timer:abcStaging?period={{timer.period}}" />
            <setBody id="select_query">
                <constant>select * from abc</constant>
            </setBody>
            <to id="jdbc_con_select" uri="jdbc:dataSource" />
            <split>
                <simple>${body}</simple>
                <process id="change_body" ref="editPayload" />
                <to id="jdbc_con_insert" uri="sql:{{sql.abcStaging}}" />
                <log id="log_1" message="Inserted abcStaging" />
            </split>
        </route>
    </camelContext>

файл свойств:

sql.abcStaging =insert into abcStaging (id, rate) values (:#id, :#rate)

editPayload Bean:

public class ChangePayload implements Processor {

  @Override
  public void process(Exchange exchange) throws Exception {
    LinkedHashMap linkedHashMap = (LinkedHashMap) exchange.getIn().getBody();
    Map<String, Object> staging = new HashMap<>();

    /* data changing logics */

    staging.put("id", "id");
    staging.put("rate", "rate");

    exchange.getOut().setBody(staging);
  }

}

1 Ответ

0 голосов
/ 05 апреля 2019

Если вашим основным требованием является выполнение одного массового запроса, вам, возможно, придется создать запрос самостоятельно в Aggregator.

Если ваша СУБД поддерживает такой синтаксис, как:

INSERT INTO T1 (F1, F2) Values (a1, b1), (a2,b2)

тогда агрегатор может создать эту большую строку. (Это было бы неосуществимо, если бы у вас было (скажем) 10000 или 100000 строк, поскольку это могло бы пересечь предел размера оператора.) Другой недостаток заключается в том, что нужно будет создавать предложения значений, зная типы данных ... не уверен, если можно параметризовать что-то подобное.

...