Ответы пользователя по тегу Java
  • Почему бьются данные, получаемые из PostgreSQL?

    TerminusMKB
    @TerminusMKB Автор вопроса
    Сниффер (Wireshark) показал следующее:
    1) При jdbc 9.4-1201-jdbc41 каждый раз отправляется один запрос. И каждый раз из БД приходит полный корректный ответ.
    Выглядит запрос в дампе сниффера так:
    Type: Parse
    Length: 169
    Statement:
    Query: select user0_."id" as id1_0_, user0_."testArray" as testArra2_0_, user0_."testTimestamp" as testTime3_0_ from "public"."users" user0_ where user0_."id" in (2)
    Parameters: 0

    2) При более старших версиях jdbc вначале (при первых попытках) идёт такой же запрос, только с указанием Statement:
    Type: Parse
    Length: 169
    Statement: S_2
    Query: select user0_."id" as id1_0_, user0_."testArray" as testArra2_0_, user0_."testTimestamp" as testTime3_0_ from "public"."users" user0_ where user0_."id" in (2)
    Parameters: 0

    3) В ситуации, когда виден баг, jdbc отправляет уже не вышеприведённый запрос, а следующее (как я понял - несколько команд за раз):
    Type: Bind
    Length: 21
    Portal:
    Statement: S_2
    Parameter formats: 0
    Parameter values: 0
    Result formats: 3
       Format: Binary (1)
       Format: Binary (1)
       Format: Binary (1)
    
    Type: Execute
    Length: 9
    Portal:
    Returns: all rows
    
    Type: Sync
    Length: 4

    И в ответ получает данные, которые глазами в дампе оценить уже сложно - идут не текстом.

    P.S.: Проблема решилась выставлением параметра jdbc драйвера preparedStatementCacheQueries в 0. Отключение кеша привело к тому, что драйвер перестал использовать prepared statements при запросах вообще и каждый раз отправляет запрос полностью, как в версии 9.4-1201-jdbc41. Так себе решение, на самом деле, т.к. надо будет пробовать еще, что получится, если я захочу сам использовать prepared statements.
    Ответ написан
    Комментировать