crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Qt mysql корректно отключиться от сервера
_KUL
  опции профиля:
сообщение 31.5.2012, 4:36
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 31.5.2012
Пользователь №: 3404

Спасибо сказали: 0 раз(а)




Репутация:   0  


Делаю:

    QSqlDatabase db  = QSqlDatabase::addDatabase("QMYSQL","mydb1");
    db.setHostName("10.10.10.10");
    db.setDatabaseName("10");
    db.setUserName("10");
    db.setPassword("10");
    db.open();

    QSqlQuery query(db);
    query.exec("SELECT 01 FROM 01 GROUP by 01");
    
    db.database("mydb1").close();


Лезу на сервак, делаю "покажи соединения с mysql"
И вижу, что моё соединение висит как TIME_WAIT

Вопрос: как корректно закрыть соединение? Что я делаю не так? Или как послать сигнал mysql серверу, чтобы он разорвал со мной соединение?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 31.5.2012, 7:53
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


так ты же базу закрываешь. Логичнее предположить, что

db.close();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
_KUL
  опции профиля:
сообщение 31.5.2012, 8:12
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 31.5.2012
Пользователь №: 3404

Спасибо сказали: 0 раз(а)




Репутация:   0  


Пожалуйста, делаем даже для тефолтного соединения:

    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();


Всё равно висит WAIT на mysql сервере ... Как же мне сделать disconnect явный, чтобы сервер меня отключил и не ожидал ничего?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 31.5.2012, 8:33
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Как я понимаю, TIME_WAIT это ничто иное как:
ESTABLISHED -> FIN_WAIT_1-> FIN_WAIT_2 -> TIME_WAIT -> CLOSED.

Подробней показано на рисунке:


Возможно будет интересно почитать: A TCP Tutorial
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
_KUL
  опции профиля:
сообщение 31.5.2012, 8:53
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 31.5.2012
Пользователь №: 3404

Спасибо сказали: 0 раз(а)




Репутация:   0  


Так вот в том и проблема, как же мне это событие CLOSED то и сделать средствами класса QSqlDatabase ? :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 31.5.2012, 10:26
Сообщение #6


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


TIME_WAIT появляется в следствии того, что закрытие соединения было выполнено и все идет хорошо.
Состояние CLOSED, устанавливается средствами самой операционной системы. Единственное что ты можешь в этом случае сделать, это подкрутить, чтобы TIME_WAIT меньше времени висел.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
_KUL
  опции профиля:
сообщение 31.5.2012, 14:14
Сообщение #7


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 31.5.2012
Пользователь №: 3404

Спасибо сказали: 0 раз(а)




Репутация:   0  


А как же тогда монстры вроде Navicat и EMS при выходе сразу же разрывают соединения и никаких вайтов не висит??? Или у них таймвайт в 1сек выставлен и меньше?! А можно как-то средствами Qt TIME_WAIT выставить вручную? (обычно минуту/2 всисит соединение )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 31.5.2012, 14:49
Сообщение #8


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


В linux есть такоей файл как /proc/sys/net/ipv4/tcp_fin_timeout, в котором задан этот самый таймаут. В винде не помню где в реестре это указывается...
У них скорее всего не висит потому, что это в принципе избыточная информация.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
_KUL
  опции профиля:
сообщение 31.5.2012, 15:45
Сообщение #9


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 31.5.2012
Пользователь №: 3404

Спасибо сказали: 0 раз(а)




Репутация:   0  


Спасибо, вроде понял ...
http://qt-project.org/forums/viewthread/17655/
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.4.2024, 15:11