Несколько операторов вставки SQL в транзакции с Camel DSL - PullRequest
0 голосов
/ 14 мая 2019

У меня следующий запрос SQL Server:

BEGIN TRANSACTION T1; 

INSERT INTO table1 (t1_column1, t2_column2)
VALUES(1, GETDATE()); 

INSERT INTO table2 (column1_fk, column1, column2)
VALUES(SCOPE_IDENTITY(), 'someValue', CONVERT(VARBINARY, 'abcdefg'); 

COMMIT TRANSACTION T1;

Каков наилучший способ сделать это с помощью Camel DSL с использованием компонента SQL?Я могу представить четыре варианта:

  1. Поместить каждый оператор вставки в отдельный "to"

    from("sourcedata")
        .setHeader("value2", simple("${date:now}"))
        .transacted()
        .to("sql:INSERT INTO table1 (t1_column1, t2_column2) VALUES (:#value1, :#value2)")
        .to("sql:INSERT INTO table1 (column1_fk, t1_column1, t2_column2) VALUES (:#GENERATED_KEYS, :#value1, :#value2)")
        .log("transaction is done");
    
  2. Разрешить JDBC выполнять несколько запросов

    Сначала установить соединение JDBC:

    String dbUrl = "jdbc:mysql:///test?allowMultiQueries=true"; 
    

    Со следующим кодом DSL Camel:

    from("sourcedata")
         .setHeader("value2", simple("${date:now}"))
        .to("sql:BEGIN;INSERT INTO table1 (t1_column1, t2_column2) VALUES (:#value1, :#value2; INSERT INTO table1 (column1_fk, t1_column1, t2_column2) VALUES (:#GENERATED_KEYS, :#value1, :#value2); COMMIT")
        .log("transaction is done");
    
  3. Написать хранимую процедуру

    from("sourcedata")
        .setHeader("value2", simple("${date:now}"))
        .to("sql-stored:template")
        .log("transaction is done");
    
  4. Запись Java-бина

    from("sourcedata")
        .setHeader("value2", simple("${date:now}"))
        .to("bean:StoreTransaction")
        .log("transaction is done");
    

Использование подготовленного оператора транзакции JDBC из кода Java, как в Пример транзакции JDBC MyKyong


Какой будет лучший вариант?(Я тоже думаю о производительности / тюнинге).Есть ли другие более простые варианты?

...