首页 > 解决方案 > 使用循环迭代时,不会为 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。

有什么建议/帮助吗?

标签: postgresqlapache-camelsql-insertprimary-keybatch-insert

解决方案


推荐阅读