You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Govind Singh (Jira)" <ji...@apache.org> on 2021/06/28 10:27:00 UTC

[jira] [Created] (CAMEL-16761) auto-generated primary keys are not retuned for Postgres when using loop iteration

Govind Singh created CAMEL-16761:
------------------------------------

             Summary: auto-generated primary keys are not retuned for Postgres when using loop iteration
                 Key: CAMEL-16761
                 URL: https://issues.apache.org/jira/browse/CAMEL-16761
             Project: Camel
          Issue Type: Bug
          Components: camel-sql
    Affects Versions: 3.10.0
         Environment: OS: Mac OS Catalina

Camel: 3.10.0

Postgresql: 12.5
            Reporter: Govind Singh


I am facing a strange behavior in Camel.

The use-case is batch insert into a table (student) and then just log the autogenerated Primary keys from that table. Database is Postgres. Note to keep it simple, this table has 2 columns, id (auto-generatedprimary key) & name (varchar 256). The (simplified) code is:
  
 
{{}}
{code:java}
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();{code}
{{}}

To keep the example simple, we iterate 3 times batch inserting 2 rows per iteration.

Expected behavior: Every (batch) insert returns newly auto-generated Primary keys per iteration

Actual behavior: Only the auto-generated primary keys in the first iteration are returned in every iteration

Related logs:
 
{{}}
{code:java}
[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{code}
{{}}

ID 8480 & 8481 are the auto-genearated primary keys in the first iteration.

Note: Auto generated PK's do work, if I don't use the batch insert logic, that is, without an Iterator and inserting only 1 row per iteration. But that is of course, extremely slow.

Any suggestion/help here ?



--
This message was sent by Atlassian Jira
(v8.3.4#803005)