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





Прочитав источник, я бы сказал, что это так:
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, верно?
@mFeinstein Первые два: да, последний следует рассматривать как независимый. Он может быть больше или меньше в зависимости от желаемого эффекта, поскольку он применяется к все чтению из сокета. Я бы сказал, что вы обычно хотите, чтобы он был больше. Если он меньше, чем loginTimeout, возможно, что вход в систему прерывается тайм-аутом чтения до истечения тайм-аута входа (хотя это будет зависеть от точного обмена протоколами, необходимого для входа в систему).
Идеально! Спасибо, Марк!
Вы читали документация? Если да, то что в этом непонятного?