postgresql - 使用循环迭代时,不会为 Postgres 重新调整自动生成的主键
问题描述
我在骆驼中面临一种奇怪的行为。
用例是批量插入表(学生),然后只记录该表中自动生成的主键。数据库是 Postgres。请注意,为简单起见,此表有 2 列,id(自动生成的主键)和名称(varchar 256)。(简化的)代码是:
from("direct:test_autogenerated_pk")
.log("test autogenerated pk")
.loop(3)
.process(ex -> {
Integer outerIteration = (Integer) ex.getProperty(Exchange.LOOP_INDEX);
log.info("Iteartion : {}", outerIteration);
final var iterator = IntStream.range(0, 2).boxed()
.map(x -> {
final var query = new HashMap<String, Object>();
Integer innerIteration = x.intValue();
query.put("studentName", "abc_" + outerIteration + "_" + innerIteration);
return query;
}).iterator();
ex.getMessage().setBody(iterator);
ex.getIn().setHeader(SqlConstants.SQL_RETRIEVE_GENERATED_KEYS, true);
})
.to("sqlComponent:INSERT INTO student (name) VALUES (:#studentName);?batch=true")
.setProperty("insertedIds", simple("${headers.CamelSqlGeneratedKeyRows}"))
.process(ex -> {
ArrayList<LinkedCaseInsensitiveMap> metadataList = (ArrayList<LinkedCaseInsensitiveMap>)ex.getIn().getExchange().getProperty("insertedIds");
for (LinkedCaseInsensitiveMap metadata : metadataList) {
Integer id = (Integer) metadata.get("id");
log.info("student ID: {}", id);
}
}).end();
为了使示例简单,我们迭代 3 次,每次迭代插入 2 行。
预期行为:每次(批量)插入每次迭代都会返回新自动生成的主键
实际行为:每次迭代只返回第一次迭代中自动生成的主键
相关日志:
[INFO ] 2021-06-28 10:45:35.991 [Test worker] MyRouteBuilder - Iteartion : 0
[INFO ] 2021-06-28 10:45:36.158 [Test worker] MyRouteBuilder - student ID: 8480
[INFO ] 2021-06-28 10:45:36.159 [Test worker] MyRouteBuilder - student ID: 8481
[INFO ] 2021-06-28 10:45:36.159 [Test worker] MyRouteBuilder - Iteartion : 1
[INFO ] 2021-06-28 10:45:36.166 [Test worker] MyRouteBuilder - student ID: 8480
[INFO ] 2021-06-28 10:45:36.166 [Test worker] MyRouteBuilder - student ID: 8481
[INFO ] 2021-06-28 10:45:36.166 [Test worker] MyRouteBuilder - Iteartion : 2
[INFO ] 2021-06-28 10:45:36.174 [Test worker] MyRouteBuilder - student ID: 8480
[INFO ] 2021-06-28 10:45:36.175 [Test worker] MyRouteBuilder - student ID: 8481
ID 8480 & 8481 是第一次迭代中自动生成的主键。
注意:如果我不使用批量插入逻辑,即没有迭代器并且每次迭代只插入 1 行,自动生成的 PK 确实可以工作。但这当然是非常缓慢的。
设置明智我没有任何问题,我使用的是最新版本的 Apache camel 和 Postgresql。
有什么建议/帮助吗?
解决方案
推荐阅读
- c++ - 没有 return 语句的函数中的 c++ 返回什么?
- c# - 将 C# 代码转换为 PHP:创建空字节数组 php 并使用套接字发送
- xamarin.ios - 适用于 Xamarin 的 Mac Mini
- php - 通过改造在文件上传期间关闭 Smack 连接
- apache-spark - Apache spark - 窗口函数,FIRST_VALUE 不起作用
- linux - 为什么 CMake 不尊重 LIBRARY_PATH 和 CPATH
- php - 为什么`mysqli_query()`返回null?我怎么能弄明白?
- linux - 独立辅助应用程序的缺点,而不是将其嵌入到主应用程序中
- c# - C# 裁剪位图 - 克隆与图形
- python - PySpark:在 sql 中访问向量元素