Исключение Spring Data CrudRepository.findAllById с большим количеством идентификаторов - PullRequest
0 голосов
/ 28 мая 2020

Я использую метод Spring Data JDB C (версия 1.1.6) CrudRepository.findAllById для загрузки сущностей из базы данных с большим количеством идентификаторов. Базовое соединение с базой данных использует базу данных Postgres. Вызов метода вызывает PSQLException:

2020-05-28 05:58:35,260 WARN com.zaxxer.hikari.pool.ProxyConnection [task-2] HikariPool-1 - Connection org.postgresql.jdbc.PgConnection@1224f39f marked as broken because of SQLSTATE(08006), ErrorCode(0)
org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend.
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:358)
    at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:448)
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:369)
    at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:159)
    at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:109)
...
Caused by: java.io.IOException: Tried to send an out-of-range integer as a 2-byte value: 137525
    at org.postgresql.core.PGStream.sendInteger2(PGStream.java:275)
    at org.postgresql.core.v3.QueryExecutorImpl.sendParse(QueryExecutorImpl.java:1553)
    at org.postgresql.core.v3.QueryExecutorImpl.sendOneQuery(QueryExecutorImpl.java:1876)
    at org.postgresql.core.v3.QueryExecutorImpl.sendQuery(QueryExecutorImpl.java:1439)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:323)

Исключение, похоже, в конечном итоге вызвано 16-битным ограничением количества значений в предложении SELECT IN (?), которое генерируется Sprint. Данные JDB C при использовании findAllById.

Должен ли я сам разбивать список идентификаторов? Разве CrudRepository.findAllById не должен правильно обрабатывать это способом, совместимым с базовым диалектом базы данных?

1 Ответ

1 голос
/ 28 мая 2020

Должен ли я сам разделить список идентификаторов?

Да, если предположить, что этот вид запроса имеет смысл в первую очередь.

Spring Data JDB C в настоящее время создает прямой запрос select ... where id in (..), который, в свою очередь, ограничен возможностями базовой базы данных / драйвера JDB C.

С очевидным пределом ~ 2 16 для Postgres, похоже, нет особой необходимости в особой обработке в Spring Data JDB C, поскольку поиск такого большого количества идентификаторов в одном выборе кажется достаточно редким, чтобы оправдать некоторое ручное кодирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...