Как работать с удаленной базой MySql?

Модератор: Модераторы

Как работать с удаленной базой MySql?

Сообщение dmadma » 13.10.2013 13:40:27

Использую для подключения к удаленной базе Sqldb и компонент TMySql50Connection.
Вначале соединяюсь с базой, потом делаю несколько запросов через TSQLQuery, и в конце закрываю соединение.
Всё работает прекрасно, но есть одна БОЛЬШАЯ проблема, с которой не могу справиться.
Если в процессе работы уже после состоявшегося соединения происходит разрыв связи (ну просто вытаскиваем штекер из сетевой карты), то при очередном запросе через TSQLQuery - всё висит!!! Просто висит, никаких ошибок - ничего. Я никак не могу отловить такой разрыв связи.
Проект достаточно большой и серьезный и вот в самом конце наткнулся на такую проблему. И она портит всё. Потому, что получается - при любом "не коннекте" вся система улетает в никуда.
P.S. программа работает на Ubuntu.

Подскажите пожалуйста - как контролировать СЕТЕВОЕ соединение с базой???
dmadma
новенький
 
Сообщения: 12
Зарегистрирован: 13.10.2013 13:30:52

Re: Как работать с удаленной базой MySql?

Сообщение Xenar » 13.10.2013 17:50:50

Скорее всего срабатывает timeout у MySQL на серве. То есть происходит автоматический разрыв соединение при отсутствии активности подключенного клиента

Проверяйте на серве в настройках MySQL соответствующие значения .

http://www.rackspace.com/knowledge_center/article/how-to-change-the-mysql-timeout-on-a-server
Аватара пользователя
Xenar
постоялец
 
Сообщения: 158
Зарегистрирован: 08.06.2011 12:54:07

Re: Как работать с удаленной базой MySql?

Сообщение dmadma » 14.10.2013 02:02:09

А причем здесь сервер? Когда обрывается соединение, то клиент должен не висеть, а выдать ошибку. На этом проблема закончилась бы, но нет... просто висим и ждем неизвестно чего. При этом, если соединение восстанавливается - висеть всё продолжает дальше
dmadma
новенький
 
Сообщения: 12
Зарегистрирован: 13.10.2013 13:30:52

Re: Как работать с удаленной базой MySql?

Сообщение stanilar » 14.10.2013 17:36:06

Не помню где я это вычитал, но вообще говоря, если обрыв соединения контролируется через TCP, то тайм-аут такого контроля сработает через 9 минут. А максимальный - до 30 минут. Все зависит от настроек ОС.

У вас просто не хватает терпения дождаться окончания ожидания.
stanilar
постоялец
 
Сообщения: 289
Зарегистрирован: 09.03.2010 19:09:02

Re: Как работать с удаленной базой MySql?

Сообщение dmadma » 14.10.2013 20:05:21

Не помню где я это вычитал, но вообще говоря, если обрыв соединения контролируется через TCP, то тайм-аут такого контроля сработает через 9 минут. А максимальный - до 30 минут. Все зависит от настроек ОС.

У вас просто не хватает терпения дождаться окончания ожидания.


После всех мытарств выяснил, что исключение всё таки срабатывает ровно после 17 минут и 45 секунд.
Вопрос главный - где эта настройка, чтобы установить её на 3 секунды???
dmadma
новенький
 
Сообщения: 12
Зарегистрирован: 13.10.2013 13:30:52

Re: Как работать с удаленной базой MySql?

Сообщение stanilar » 15.10.2013 09:43:08

dmadma писал(а):Вопрос главный - где эта настройка, чтобы установить её на 3 секунды?


Вот, это не главный вопрос, это правильный вопрос. Как контролировать тайм-ауты TCP соединения. Могу предложить посмотреть книгу Антона Григорьева "О чем не пишут в книгах по Delphi", там TCP неплохо разжеван.

В качестве идеи могу предложить открыть дополнительное соединение к серверу, и пинговать сервер. При отсутствии пинга уничтожать все потоки.

P.S. словосочетание "TCP connect timeout" гуглится просто на ура. В основном английские ресурсы, похоже что у нас такими вопросами мало кто озадачивается.

P.P.S уверен, такая настройка должна быть и в самом компоненте. Либо меняйте компонент.
stanilar
постоялец
 
Сообщения: 289
Зарегистрирован: 09.03.2010 19:09:02

Re: Как работать с удаленной базой MySql?

Сообщение Ism » 15.10.2013 14:20:27

http://dev.mysql.com/doc/refman/5.0/en/ ... tions.html
connect_timeout прописать в Params
reconnect=true будет пересоединяться автоматически при доступности базы

Не надо ничего контролировать , всё уже есть в опциях
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Как работать с удаленной базой MySql?

Сообщение dmadma » 15.10.2013 14:59:36

Ism писал(а):connect_timeout прописать в Params
reconnect=true будет пересоединяться автоматически при доступности базы

Не надо ничего контролировать , всё уже есть в опциях


---1---
Компонент SQLdb -> MySql50Connection
В свойство Params пишу
connect_timeout=5
timeout=5
MYSQL_OPT_READ_TIMEOUT=5

соединяюсь - отключаю сетку - делаю запрос - висим 18 минут - появляется исключение

---2---
Компонент Zeos Access -> ZConnection
В свойство Params пишу
connect_timeout=5
timeout=5
MYSQL_OPT_READ_TIMEOUT=5

соединяюсь - отключаю сетку - делаю запрос - висим 18 минут - появляется исключение

----------------

На форуме MySql сказали, что именно MYSQL_OPT_READ_TIMEOUT нужно установить. Но как это сделать имеющимися компонентами. Если писать без компонентов, то есть функция mysql_options, но тогда зачем такие компоненты нужны. В них должна быть своя настройка.

Как используя компоненты для подключения к базе MySql установить нужный MYSQL_OPT_READ_TIMEOUT ?
И вообще откуда такая длительная задержка на 18 минут появляется?
dmadma
новенький
 
Сообщения: 12
Зарегистрирован: 13.10.2013 13:30:52

Re: Как работать с удаленной базой MySql?

Сообщение SeZuka » 15.10.2013 16:29:24

dmadma писал(а):И вообще откуда такая длительная задержка на 18 минут появляется?

Компьютер не пробовали менять на более современный? :lol:
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Re: Как работать с удаленной базой MySql?

Сообщение Ism » 15.10.2013 17:03:13

dmadma писал(а):На форуме MySql сказали, что именно MYSQL_OPT_READ_TIMEOUT нужно установить. Но как это сделать имеющимися компонентами. Если писать без компонентов, то есть функция mysql_options, но тогда зачем такие компоненты нужны. В них должна быть своя настройка.

Как используя компоненты для подключения к базе MySql установить нужный MYSQL_OPT_READ_TIMEOUT ?
И вообще откуда такая длительная задержка на 18 минут появляется?

Возможно TMySql50Connection просто не передаёт параметр библиотеке. В ZeoDbo такое точно работает. Попробуйте сделать тест на Zeos, если сработает, то проблема в компоненте
Также проверьте версию библиотеки libmysql , она должна быть той же версии, что и сервер

Кроме того, возможно параметры чувствительны к регистру
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Как работать с удаленной базой MySql?

Сообщение dmadma » 15.10.2013 20:19:29

Компьютер не пробовали менять на более современный?

3000 MHz - мало?

В ZeoDbo такое точно работает

А разве компонент Zeos Access -> ZConnection не оттуда?

РЕЗУЛЬТАТ НА ДАННЫЙ МОМЕНТ ТАКОВ:

По поводу висящего запроса к базе данных MySql я выяснил, что сам по себе запрос отправляет данные и ждет ответа, при этом он не проверяет само соединение. Поэтому нужно проверять такие вещи отдельно. Для этого создается отдельный поток и в нем через интервал (10-60 сек) проверяется open-close через дополнительное соединение к этой же базе. Как только выскакивает исключение - значить соединение разорвано и нужно закрыть все другие соединения к базе.

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

Спасибо за помощь...
dmadma
новенький
 
Сообщения: 12
Зарегистрирован: 13.10.2013 13:30:52

Re: Как работать с удаленной базой MySql?

Сообщение Ism » 15.10.2013 22:13:30

Посмотрите ссылку выше , у mysql есть опция wait, время ожидания соединения, может это оно
Можно делать запросы асинхронно, тогда не нужно будет дополнительных процессов для контроля
Можно перед запросом проверять соединение, это предотвратит зависание

Добавлено спустя 8 минут 50 секунд:
Глава 23 TCP таймер "оставайся в живых"
Хорошая статья на эту тему http://www.soslan.ru/tcp/tcp23.html

Добавлено спустя 22 минуты 23 секунды:
Mysql может работать через ssl, возможно там проверяется соединение
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16

Рейтинг@Mail.ru