У меня следующий запрос 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?Я могу представить четыре варианта:
Поместить каждый оператор вставки в отдельный "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");
Разрешить 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");
Написать хранимую процедуру
from("sourcedata")
.setHeader("value2", simple("${date:now}"))
.to("sql-stored:template")
.log("transaction is done");
Запись Java-бина
from("sourcedata")
.setHeader("value2", simple("${date:now}"))
.to("bean:StoreTransaction")
.log("transaction is done");
Использование подготовленного оператора транзакции JDBC из кода Java, как в Пример транзакции JDBC MyKyong
Какой будет лучший вариант?(Я тоже думаю о производительности / тюнинге).Есть ли другие более простые варианты?