Russian Qt Forum

Qt => Базы данных => Тема начата: baka от Декабрь 28, 2007, 12:53



Название: Lost connection to MySQL server during query QMYSQL: Unable to execute query
Отправлено: baka от Декабрь 28, 2007, 12:53
Здравствуйте, происходит такая ошибка
Lost connection to MySQL server during query QMYSQL: Unable to execute query
и такая
MySQL server has gone away QMYSQL : Unable to execute query

происходят они не всегда а только если я обращаюсь к БД из параллельного потока  и главного одновременно.
( внутри MyThread::run() происходит выборка из одной таблицы.)

т.е. из двух потоков отправляем запросы к QSqlDatabase, а она берет и отваливается :o

Что делать?
Куда смотреть?




Название: Re: Lost connection to MySQL server during query QMYSQL: Unable to execute query
Отправлено: ритт от Декабрь 28, 2007, 14:53
тролли на этот счёт советуют работать с бд из главного потока, т.к. с разными бд получаются разные побочные эффекты

в твоём случае, как вариант: QSqlDatabase создавай не с дефолтным именем, а с каким-нибудь ууидом, во втором потоке тоже создавай QSqlDatabase с ууидом (этот ууид запоминаешь) и открывай это новое соединение, по завершению работы потока просто закроешь соединение и удалишь QSqlDatabase по сохранённому ууиду


Название: Re: Lost connection to MySQL server during query QMYSQL: Unable to execute query
Отправлено: baka от Декабрь 29, 2007, 12:46
спасибо,
вроде заработало.


Название: Re: Lost connection to MySQL server during query QMYSQL: Unable to execute query
Отправлено: DpoHro от Февраль 14, 2008, 19:53
Аналогичная ситуация (ошибки) у меня происходит когда истекает установленное на сервере время подключения, сервер просто разрывает соединение и последующие запросы не проходят.

У меня все выборки идут в потоке и тесно связаны с сигналами виджетов. То есть если перед каждой выборкой открывать, а после закрывать соединение, то получится довольно много соединений за короткий промежуток времени, сдается мне это не есть гуд...

???


Название: Re: Lost connection to MySQL server during query QMYSQL: Unable to execute query
Отправлено: Вячеслав от Февраль 14, 2008, 20:07
Гы .... а выполнить по таймеру холостой запрос,когда ничего не делаем ?


Название: Re: Lost connection to MySQL server during query QMYSQL: Unable to execute query
Отправлено: DpoHro от Февраль 14, 2008, 20:15
Гы .... а выполнить по таймеру холостой запрос,когда ничего не делаем ?
Вы верите в правильность такого решения?

вариант 1) Если вдруг блондинко оператор использующая мою прогу подвесит комп на те самые 30 сек. то события от таймера могут и не прийти... вернее могут прийти с опозданием.
вариант 2) Может оказаться так, что канал будет сильно загружен (сервер в интернете) и какой-то запрос подлвиснет, может и на 30 сек. следующий запрос выполнится? Это вопрос, я сам не знаю =)


Название: Re: Lost connection to MySQL server during query QMYSQL: Unable to execute query
Отправлено: DpoHro от Февраль 14, 2008, 20:19
У меня рисуется перспектива на 500-700 пользователей онлайн, я вот думаю как сократить количество запросов к БД ...


Название: Re: Lost connection to MySQL server during query QMYSQL: Unable to execute query
Отправлено: Вячеслав от Февраль 14, 2008, 21:43
1) За мускул не скажу,но у того-же  птица (firebird) есть KeepAlive настройки - сервер сам проверяет жив клиент или нет ;) Это окромя таймаута для запросов.... Может у мускула что-нибудь такое есть ;)
2)про блондинко - кто мешает создать поток с Реал-тайм приоритетом со свой QSQLDatabase и дергать его через мутекс (WaitForSingleObject) который будет дергать сервер ? В лоб но ой - работает ;)
3) А в сторону трехзвенки не посмотреть ? Может оно менее прожорливо по ресурсам \соединениям будет ? Да и 700 соединений - это далеко не показатель...Cоединение оно что делает - тупой запрос типа select count(*) from my table или запускает пересчет квартальной статистики ?? ;) И обязательно _одна_ БД (сервер) ? Запаралелить низя ?


Название: Re: Lost connection to MySQL server during query QMYSQL: Unable to execute query
Отправлено: DpoHro от Февраль 14, 2008, 21:57
Да, но мне кажется с таймером это скорее как временное решение, хотя нет ничего постоянней чем временное =)

Есть несколько функций у программы ресурсоемких - это статистика, но оно не часто, а так восновном 20-25 селектов за 1 расчет для блондинко нескольких цифарок, ну впринципе то таблицы небольшие, тут думаю не особо отожрутся ресурсы, но программа разрастается быстро... и запросов все больше... Но не суть, мне важнее разобраться с потерей коннекта.

Вобщем то я все что навыбирал из БД храню в QSqlQuery никуда не перекидываю.
Очень не хочется мне делать свои структуры для хранения полученной информации ...
Но происходит следующее:
 после потери соединения - выдается ошибка, пытаюсь при ее возникновении пересоздать соединение и тут уже я не могу работать с ранее созданными объектами QSqlQuery. Замкнутый круг...

Мне то собственно и не нужно перманентное соединение с БД, но если я буду закрывать соединение и потом снова его создавать, то не смогу работать с кверями нормально ((

Трехзвенка, простите мою темноту, это что?


Название: Re: Lost connection to MySQL server during query QMYSQL: Unable to execute query
Отправлено: Вячеслав от Февраль 15, 2008, 00:09
Трехзвенка - клиент <-> сервер приложений <-> сервер БД ;)


Название: Re: Lost connection to MySQL server during query QMYSQL: Unable to execute query
Отправлено: Tonal от Февраль 15, 2008, 08:09
Мы всегда перегоняем ответы сервера в кеш объектов на клиенте, поэтому глубоко фиолетово в каком коннекте что получено. :)

P.S. [off]2 Вячеслав нихт нужно в конце предложения ставить - так баще будет. :) [/off]


Название: Re: Lost connection to MySQL server during query QMYSQL: Unable to execute query
Отправлено: DpoHro от Февраль 15, 2008, 09:04
С трехзвенкой ясно...

Мы всегда перегоняем ответы сервера в кеш объектов на клиенте...
Если можно поподробнее, как это реализуется?
Дублирующий набор?

И всеже странно, раньше все работало, более того, я сейчас взял предыдущую версию программы, и там не теряется коннект!!!
С чем это может быть связано, я чтото напортачил видимо ...

Цитировать
P.S. [off]2 Вячеслав нихт нужно в конце предложения ставить - так баще будет. :-) [/off]
Да меня тоже подпись порадовала 5+


Название: Re: Lost connection to MySQL server during query QMYSQL: Unable to execute query
Отправлено: Вячеслав от Февраль 15, 2008, 10:22
Мы всегда перегоняем ответы сервера в кеш объектов на клиенте, поэтому глубоко фиолетово в каком коннекте что получено. :-)

P.S. [off]2 Вячеслав нихт нужно в конце предложения ставить - так баще будет. :-) [/off]
ГЫ ;) кэш это сила .... особенно в СКВ ;) ;)

нихт в конце  - это по правилам немецкой грамматики ;) В свое время даже хохма была на одной конференции, когда товарисч оттуда говорит _очень_ длинную фразу ( по частям, для синхронного перевода) и в конце звучит магическое 'нихт' ... Переводчик думал не долго - "Так вот - все выше сказаанное (маленькая пауза) - неправда ;)"
PS Сорри за офф - праздник вчера удался ;) ;D ;D ;D


Название: Re: Lost connection to MySQL server during query QMYSQL: Unable to execute query
Отправлено: DpoHro от Февраль 15, 2008, 12:17
Сделал так:

Код:
QSqlQuery qq = db.exec("SET NAMES 'cp1251'");
if (qq.lastError().type()!=QSqlError::NoError)
{
db.close();
db.open();
}

И овцы целы и волки сыты =)
И всеже странно почему раньше работало, хм...