带有 SQL 组件的 Apache Camel 用于 batch=true 的插入会抛出多个表的错误
Apache Camel with SQL component for inserts with batch=true throws error with multiple tables
我正在使用带有 sql 组件的 Apache camel 来对 Postgresql 执行 sql 操作。我已经尝试使用 batch=true 选项并在邮件正文。为了使示例简单,将 Student 作为 table 名称并具有 2 列 name & age, 下面是显示相关部分的代码片段:
from("direct:batch_insert_single_table")
...
.process(ex -> {
log.info("batch insert for single table");
final var iterator = IntStream.range(0, 5000).boxed()
.map(x -> {
final var query = new HashMap<String, Object>();
Integer counter = x.intValue();
String name = "abc_" + counter;
query.put("name", name);
query.put("age", counter);
return query;
}).iterator();
ex.getMessage().setBody(iterator);
})
.to("sqlComponent:INSERT INTO student (name, age) VALUES (:#name, :#age);?batch=true")
...
;
5000 条记录总共需要 10 秒。
但是,当我使用相同的方法在 多个不同的 tables 上批量插入时,我得到一个错误:
这是无效的代码:
from("direct:batch_insert_multiple_tables")
...
.process(ex -> {
log.info("batch insert for multiple tables");
final var iterator = IntStream.range(0, 3).boxed()
.map(x -> {
final var query = new HashMap<String, Object>();
Integer counter = x.intValue();
String name = "abc_" + counter;
query.put("table", "test" + counter);
query.put("name", "name");
query.put("age", counter);
return query;
}).iterator();
ex.getMessage().setBody(iterator);
})
.to("sqlComponent:INSERT INTO :#table (name,age) VALUES (:#name,:#age);?batch=true")
...
;
table的测试 0、测试 1 和测试 2 已经存在。
抛出的异常是:
Failed delivery for (MessageId: A0D98C12BAD769F-0000000000000000 on ExchangeId: A0D98C12BAD769F-0000000000000000). Exhausted after delivery attempt: 1 caught: org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar []; nested exception is org.postgresql.util.PSQLException: ERROR: syntax error at or near ""
Position: 13
如果我做错了什么或者 Apache Camel 根本不支持我的方法,请提出建议。
注意:我使用的是最新版本的 apache camel 和 Postgre。
此致,
GSN
您不能在 PostgreSQL 中为 table 名称、列名称或任何其他 标识符 使用参数。您要么必须使用动态生成的 SQL 语句(即您在 Java 代码中构建的语句;请特别注意 SQL 注入)或两个 SQL 语句.
我正在使用带有 sql 组件的 Apache camel 来对 Postgresql 执行 sql 操作。我已经尝试使用 batch=true 选项并在邮件正文。为了使示例简单,将 Student 作为 table 名称并具有 2 列 name & age, 下面是显示相关部分的代码片段:
from("direct:batch_insert_single_table")
...
.process(ex -> {
log.info("batch insert for single table");
final var iterator = IntStream.range(0, 5000).boxed()
.map(x -> {
final var query = new HashMap<String, Object>();
Integer counter = x.intValue();
String name = "abc_" + counter;
query.put("name", name);
query.put("age", counter);
return query;
}).iterator();
ex.getMessage().setBody(iterator);
})
.to("sqlComponent:INSERT INTO student (name, age) VALUES (:#name, :#age);?batch=true")
...
;
5000 条记录总共需要 10 秒。
但是,当我使用相同的方法在 多个不同的 tables 上批量插入时,我得到一个错误:
这是无效的代码:
from("direct:batch_insert_multiple_tables")
...
.process(ex -> {
log.info("batch insert for multiple tables");
final var iterator = IntStream.range(0, 3).boxed()
.map(x -> {
final var query = new HashMap<String, Object>();
Integer counter = x.intValue();
String name = "abc_" + counter;
query.put("table", "test" + counter);
query.put("name", "name");
query.put("age", counter);
return query;
}).iterator();
ex.getMessage().setBody(iterator);
})
.to("sqlComponent:INSERT INTO :#table (name,age) VALUES (:#name,:#age);?batch=true")
...
;
table的测试 0、测试 1 和测试 2 已经存在。 抛出的异常是:
Failed delivery for (MessageId: A0D98C12BAD769F-0000000000000000 on ExchangeId: A0D98C12BAD769F-0000000000000000). Exhausted after delivery attempt: 1 caught: org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar []; nested exception is org.postgresql.util.PSQLException: ERROR: syntax error at or near ""
Position: 13
如果我做错了什么或者 Apache Camel 根本不支持我的方法,请提出建议。
注意:我使用的是最新版本的 apache camel 和 Postgre。
此致, GSN
您不能在 PostgreSQL 中为 table 名称、列名称或任何其他 标识符 使用参数。您要么必须使用动态生成的 SQL 语句(即您在 Java 代码中构建的语句;请特别注意 SQL 注入)或两个 SQL 语句.