В чем разница между loginTimeout, connectTimeout и socketTimeout в pgjdbc

В pgjdbc у нас есть:

  • loginTimeout
  • connectTimeout
  • socketTimeout
  • cancelSignalTimeout

Но мне непонятно, в чем разница (когда они применяются) между loginTimeout, connectTimeout и socketTimeout.

Вы читали документация? Если да, то что в этом непонятного?

Mark Rotteveel 23.05.2019 10:15

Да. Я не вижу, чем connectTimeout отличается от loginTimeout, насколько я понимаю, клиент установит SSL-соединение с сервером, а затем войдет в базу данных... Так же и loginTimeout запускается после установления SSL-соединения, или начинается ли он вместе с connectTimeout, так как я отправил команду входа, которая использует SSL? И будет ли socketTimeout применяться во время входа в систему, так как я думаю, что это чтение сокета?

Michel Feinstein 23.05.2019 15:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
2
2 766
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Прочитав источник, я бы сказал, что это так:

  • connectTimeout указывает, как долго ждать установления сетевого TCP-соединения.

  • loginTimeout указывает, сколько времени может занять весь процесс входа в базу данных

  • socketTimeout указывает, как долго клиент будет ждать ответа на команду от сервера, прежде чем выдать ошибку

Первые два связаны с установлением соединения, третий актуален для всего сеанса базы данных.

Установление TCP-соединения — это часть, устанавливающее соединение с базой данных.

Ответ принят как подходящий

Как указано в Документация по JDBC для PostgreSQL:

  • loginTimeout = int

    Specify how long to wait for establishment of a database connection. The timeout is specified in seconds.

  • connectTimeout = int

    The timeout value used for socket connect operations. If connecting to the server takes longer than this value, the connection is broken. The timeout is specified in seconds and a value of zero means that it is disabled.

  • socketTimeout = int

    The timeout value used for socket read operations. If reading from the server takes longer than this value, the connection is closed. This can be used as both a brute force global query timeout and a method of detecting network problems. The timeout is specified in seconds and a value of zero means that it is disabled.

  • cancelSignalTimeout = int

    Cancel command is sent out of band over its own connection, so cancel message can itself get stuck. This property controls "connect timeout" and "socket timeout" used for cancel commands. The timeout is specified in seconds. Default value is 10 seconds.

connectTimeout и socketTimeout — тайм-ауты для низкоуровневых операций сокета. connectTimeout определяет время, необходимое для установления соединения через сокет TCP. Установление TCP-соединения не гарантирует вход в систему (даже не гарантирует, что вы подключаетесь к серверу PostgreSQL, только то, что вы подключились к чему-то, что приняло ваше TCP-соединение). socketTimeout определяет время, в течение которого сокет может быть заблокирован в ожидании чтения из сокета. Это включает чтение все с сервера не только во время соединения, но и во время последующего взаимодействия с сервером (например, выполнения запросов).

С другой стороны, loginTimeout управляет работой протокола PostgreSQL при подключении и аутентификации на сервере PostgreSQL. Это включает в себя установление TCP-соединения, за которым следует один или несколько обменов пакетами для рукопожатия и аутентификации на сервере PostgreSQL (я не знаком с деталями протокола PostgreSQL, поэтому не могу быть точным).

Обмен этими пакетами может занять дополнительное время, или если вы подключились к чему-то, что не является сервером PostgreSQL, обмен пакетами может остановиться. Это может быть возможно решить с тщательным контролем как connectTimeout, так и socketTimeout, но нет никаких гарантий (например, обмен данными происходит, но вход в систему никогда не завершается). Кроме того, поскольку socketTimeout также управляет всеми другими операциями с соединением, вы можете установить его выше (например, для других операций, которые требуют много времени для получения ответа), чем вы готовы ждать завершения входа в систему.

cancelSignalTimeout используется в качестве тайм-аута сокета а также для подключения отдельного TCP-соединения, используемого для команд отмены.

Так что в некотором смысле loginTimeout >= connectTimeout >= socketTimeout, верно?

Michel Feinstein 24.05.2019 15:55

@mFeinstein Первые два: да, последний следует рассматривать как независимый. Он может быть больше или меньше в зависимости от желаемого эффекта, поскольку он применяется к все чтению из сокета. Я бы сказал, что вы обычно хотите, чтобы он был больше. Если он меньше, чем loginTimeout, возможно, что вход в систему прерывается тайм-аутом чтения до истечения тайм-аута входа (хотя это будет зависеть от точного обмена протоколами, необходимого для входа в систему).

Mark Rotteveel 24.05.2019 16:33

Идеально! Спасибо, Марк!

Michel Feinstein 24.05.2019 16:50

Другие вопросы по теме