[SOLVED] Qt mysql корректно отключиться от сервера (QDatabase correct disconnect from MySql-server)
-
Здравствуйте!
Делаю следующее:@ QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("10.10.10.10");
db.setDatabaseName("10");
db.setUserName("10");
db.setPassword("10");
db.open();QSqlQuery query; query.exec("SELECT 01 FROM 01 GROUP by 01"); db.close();
@
Захожу на сервер, делаю "покажи соединения с mysql"
И вижу, что моё соединение в состоянии TIME_WAITВопрос: как корректно закрыть соединение? Что я делаю не так? Или как послать сигнал mysql серверу, чтобы он разорвал со мной соединение? Как выполнить disconnect?
-
RU: Все OK! TIME_WAIT - это состояние после закрытия сокета. Нужно для получения окончательного FIN пакета от собеседника. Отправка этого пакета желательна, но не обязательна. Многие сервивсы и программы этого не делают. По умолчанию сокет находится в состояние TIME_WAIT 60 секунд. Рекомендованное значение для обычного сервера 30 секунд, для продуктивного 5 секунд. Установить ети заничения в линуксе можно так:
@echo "5" > /proc/sys/net/ipv4/tcp_fin_timeout@
или
@echo "30" > /proc/sys/net/ipv4/tcp_fin_timeout@Пожалуйста добавь префикс "[SOLVED]" слева в теме топика, если больше нет вопросов по топику.
ENG: The TCP TIME_WAIT interval specifies the length of time that a socket waits for a FIN packet from the sender before forcibly closing. In high-load environments, the proxy server may appear to stall if a large number of sockets remain suspended in the TIME_WAIT state after their connections are closed. Reducing the TCP time wait interval will reduce the number of suspended sockets and, in high-load environments, may prevent the proxy server from appearing to stall. By default it is set to 60 seconds. It is recommended that this interval be set to 30 seconds or 5 seconds for high-load servers.
To set the TCP time wait interval on linux :
@echo "5" > /proc/sys/net/ipv4/tcp_fin_timeout@
or
@echo "30" > /proc/sys/net/ipv4/tcp_fin_timeout@Please add prefix "[SOLVED]" left to the topic subject if you don't have questions anymore.
-
А каким способом можно послать FIN сигнал методами Qt? На стороне клиента можно отправить серверу параметр, чтобы он ждал TIME_WAIT не то, которое у него в системе, а которое отправил клиент?
Google translate
And how can you send a FIN signal methods Qt? On the client side, you can send a server setting, that he was waiting for TIME_WAIT is not something that he has in the system, which has sent the client?
-
bq. А каким способом можно послать FIN сигнал методами Qt?
Это происходит автоматически когда ты закрываеш сокет. TCP - всегда должно удостовериться что пакет доставлен, даже если это FIN пакет, вдруг FIN не дошёл? его тогда нужно переслать, вдруг пересланый пакет не дошел? значит его надо переслать и так до бесконечности, вот этим гемороем и занимается сокет в состояние TIME_WAIT. точнее не сам сокет естественно, а подсистема ОС отвечающая за TCP за которую отвечает подсистема сетевого стэка, за который отвечает ядро системы.
В общем в любой нормальной рабочей системе должен быть TIME_WAIT. Т.к. это предписывает RFC протокола TCP. Без TIME_WAIT - система не можен называться безопасной и синхронной. TIME_WAIT должен быть! Так надо!
Но если всетаки прям нужно чтобы порт освободился мгновенно без TIME_WAIT, то нужно не закрывать сокет(close(socket)) а вырудаьб его лопатой по затылку(shutdown(socket, 2)). Так же есть опция SO_LINGER с таймаутом 0. Так же на сервере можно настроить переиспользование сокетов находящихся в состояние TIME_WAIT, изменить его можно в
@/proc/sys/net/ipv4/tcp_tw_reuse@В общем пробуй поиграться с сабкласингом класса QTcpSocket, если уж так мешает TIME_WAIT
bq. На стороне клиента можно отправить серверу параметр, чтобы он ждал TIME_WAIT не то, которое у него в системе, а которое отправил клиент?
Нет, это не возможно. Этот параметр контролируется только сетевым стэком.
-
Спасибо вам большое, стало все понятно! :)