Postgres 11, получает сломанную трубу, если остается неактивным - PullRequest
0 голосов
/ 04 ноября 2019

Приложение Spring время от времени регистрирует сломанную трубу. Для решения проблемы устаревших соединений приложение уже использует -

testWhileIdle = true и validationQuery = SELECT 1

Трассировка стека -

    Caused by: org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend.
            at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:333)
            at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:441)
            at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:365)
            at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:155)
            at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:118)
            at sun.reflect.GeneratedMethodAccessor89.invoke(Unknown Source)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at org.apache.tomcat.jdbc.pool.StatementFacade$StatementProxy.invoke(StatementFacade.java:114)
            at com.sun.proxy.$Proxy137.executeQuery(Unknown Source)
            at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:70)
            ... 133 more
    Caused by: java.net.SocketException: Connection reset
            at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:115)
            at java.net.SocketOutputStream.write(SocketOutputStream.java:155)
            at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
            at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
            at org.postgresql.core.PGStream.flush(PGStream.java:514)
            at org.postgresql.core.v3.QueryExecutorImpl.sendSync(QueryExecutorImpl.java:1363)
            at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:304)
            ... 143 more
     Caused by java.net.SocketException: Broken pipe (Write failed)

Неопределенное ощущение, если приложение какое-то время остается неактивным, то это может вызвать проблемы с подключением к бэкэнду или наоборот. Но поскольку эту проблему нельзя воспроизвести локально, на это трудно указать.

1 Ответ

0 голосов
/ 04 ноября 2019

Вы можете попробовать увеличить время ожидания простоя.

idle_in_transaction_session_timeout = 30000

в postgresql.conf

Но ваша ошибка мне кажется странной. Я бы, вероятно, проверил, если у вас нет возможности подключиться ко многим соединениям.

Со стороны весенней загрузки вы можете попробовать добавить следующие свойства:

spring.datasource.test-on-borrow=true
   spring.datasource.validation-query=SELECT 1
   spring.datasource.validation-interval=30000

вы можете попробовать уменьшить валидациюинтервал. Я установил его там по умолчанию

Надеюсь, это поможет

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