java - 带有 SQL 组件的 Apache Camel 用于批处理 = true 的插入会在多个表中引发错误
问题描述
我正在使用带有 sql 组件的 Apache camel 来使用 Postgresql 执行 sql 操作。我已经尝试使用 batch=true 选项在单个表中成功插入多行,并在消息正文中提供迭代器。为了使示例简单,使用Student作为表名并具有 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 秒。
但是,当我使用相同的方法在多个不同的表上批量插入时,出现错误:
这是不起作用的代码:
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")
...
;
表 test0、test1 和 test2 已经存在。抛出的异常是:
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 "$1"
Position: 13
如果我做错了什么或者我的方法根本不支持 Apache Camel,请建议。
注意:我使用的是最新版本的 apache camel & Postgre。
问候, GSN
解决方案
在 PostgreSQL 中,您不能将参数用于表名、列名或任何其他标识符。您要么必须使用动态生成的 SQL 语句(即,您在 Java 代码中构造的语句;特别注意 SQL 注入),要么必须使用两个 SQL 语句。
推荐阅读
- c++ - 如何使用 Rcpp 就地缩放 NumericMatrix?
- xamarin - Xamarin:Xamarin Google Map 始终显示 Xamarin.Forms.GoogleMaps 而不是加载地图
- linux - 如何了解 GNU 并行一次可以运行的最大进程数?
- web-crawler - 如何使用 nightmare.js 拒绝自动访问此页面
- websocket - 如何使用 Adonis 的 websocket 中间件返回 401 错误
- dynamics-crm - 在 Microsoft Dynamics CRM 实体中显示特定字段更改的查询
- hadoop - hdfs如何计算已用(剩余)空间配额?如何将小文件存储在hdfs中?
- python - xmltodict 并再次返回;属性获得自己的标签
- angular - 在 tomcat 服务器的根目录中搜索 Angular 资产文件夹
- jquery - 重新加载页面并更改元素的类