Russian Qt Forum
Ноябрь 23, 2024, 18:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Lost connection to MySQL server during query QMYSQL: Unable to execute query  (Прочитано 10755 раз)
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, а она берет и отваливается Шокированный

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


Записан
ритт
Гость
« Ответ #1 : Декабрь 28, 2007, 14:53 »

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

в твоём случае, как вариант: QSqlDatabase создавай не с дефолтным именем, а с каким-нибудь ууидом, во втором потоке тоже создавай QSqlDatabase с ууидом (этот ууид запоминаешь) и открывай это новое соединение, по завершению работы потока просто закроешь соединение и удалишь QSqlDatabase по сохранённому ууиду
Записан
baka
Гость
« Ответ #2 : Декабрь 29, 2007, 12:46 »

спасибо,
вроде заработало.
Записан
DpoHro
Гость
« Ответ #3 : Февраль 14, 2008, 19:53 »

Аналогичная ситуация (ошибки) у меня происходит когда истекает установленное на сервере время подключения, сервер просто разрывает соединение и последующие запросы не проходят.

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

Непонимающий
Записан
Вячеслав
Гость
« Ответ #4 : Февраль 14, 2008, 20:07 »

Гы .... а выполнить по таймеру холостой запрос,когда ничего не делаем ?
Записан
DpoHro
Гость
« Ответ #5 : Февраль 14, 2008, 20:15 »

Гы .... а выполнить по таймеру холостой запрос,когда ничего не делаем ?
Вы верите в правильность такого решения?

вариант 1) Если вдруг блондинко оператор использующая мою прогу подвесит комп на те самые 30 сек. то события от таймера могут и не прийти... вернее могут прийти с опозданием.
вариант 2) Может оказаться так, что канал будет сильно загружен (сервер в интернете) и какой-то запрос подлвиснет, может и на 30 сек. следующий запрос выполнится? Это вопрос, я сам не знаю =)
« Последнее редактирование: Февраль 14, 2008, 20:18 от DpoHro » Записан
DpoHro
Гость
« Ответ #6 : Февраль 14, 2008, 20:19 »

У меня рисуется перспектива на 500-700 пользователей онлайн, я вот думаю как сократить количество запросов к БД ...
Записан
Вячеслав
Гость
« Ответ #7 : Февраль 14, 2008, 21:43 »

1) За мускул не скажу,но у того-же  птица (firebird) есть KeepAlive настройки - сервер сам проверяет жив клиент или нет Подмигивающий Это окромя таймаута для запросов.... Может у мускула что-нибудь такое есть Подмигивающий
2)про блондинко - кто мешает создать поток с Реал-тайм приоритетом со свой QSQLDatabase и дергать его через мутекс (WaitForSingleObject) который будет дергать сервер ? В лоб но ой - работает Подмигивающий
3) А в сторону трехзвенки не посмотреть ? Может оно менее прожорливо по ресурсам \соединениям будет ? Да и 700 соединений - это далеко не показатель...Cоединение оно что делает - тупой запрос типа select count(*) from my table или запускает пересчет квартальной статистики ?? Подмигивающий И обязательно _одна_ БД (сервер) ? Запаралелить низя ?
Записан
DpoHro
Гость
« Ответ #8 : Февраль 14, 2008, 21:57 »

Да, но мне кажется с таймером это скорее как временное решение, хотя нет ничего постоянней чем временное =)

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

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

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

Трехзвенка, простите мою темноту, это что?
« Последнее редактирование: Февраль 14, 2008, 22:04 от DpoHro » Записан
Вячеслав
Гость
« Ответ #9 : Февраль 15, 2008, 00:09 »

Трехзвенка - клиент <-> сервер приложений <-> сервер БД Подмигивающий
Записан
Tonal
Гость
« Ответ #10 : Февраль 15, 2008, 08:09 »

Мы всегда перегоняем ответы сервера в кеш объектов на клиенте, поэтому глубоко фиолетово в каком коннекте что получено. Улыбающийся

P.S. [off]2 Вячеслав нихт нужно в конце предложения ставить - так баще будет. Улыбающийся [/off]
« Последнее редактирование: Февраль 15, 2008, 11:25 от Tonal » Записан
DpoHro
Гость
« Ответ #11 : Февраль 15, 2008, 09:04 »

С трехзвенкой ясно...

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

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

Цитировать
P.S. [off]2 Вячеслав нихт нужно в конце предложения ставить - так баще будет. :-) [/off]
Да меня тоже подпись порадовала 5+
Записан
Вячеслав
Гость
« Ответ #12 : Февраль 15, 2008, 10:22 »

Мы всегда перегоняем ответы сервера в кеш объектов на клиенте, поэтому глубоко фиолетово в каком коннекте что получено. :-)

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

нихт в конце  - это по правилам немецкой грамматики Подмигивающий В свое время даже хохма была на одной конференции, когда товарисч оттуда говорит _очень_ длинную фразу ( по частям, для синхронного перевода) и в конце звучит магическое 'нихт' ... Переводчик думал не долго - "Так вот - все выше сказаанное (маленькая пауза) - неправда Подмигивающий"
PS Сорри за офф - праздник вчера удался Подмигивающий Смеющийся Смеющийся Смеющийся
Записан
DpoHro
Гость
« Ответ #13 : Февраль 15, 2008, 12:17 »

Сделал так:

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

И овцы целы и волки сыты =)
И всеже странно почему раньше работало, хм...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 21.