Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: climber от Декабрь 07, 2011, 13:55



Название: БД, select, многопоточность
Отправлено: climber от Декабрь 07, 2011, 13:55
Добрый день, форумчане! Надеюсь на вашу помощь!

Суть проблемы. Есть база данных MS SQL Server 2003. В очень упрощеной форме ее структура следующая. В БД есть таблица с перечнем параметров (порядка 5000 штук) и таблица куда раз в секунду делается 5000 записей со значениями этих параметров.

Я создал класс ThreadDatabase унаследованный от QThread, в конструкторе которого описал конект к базе данных, а в методе run() - sql запрос (select) и обработка результатов.

Далее создал N (пусть для простоты их будет 5) экземпляров класса  ThreadDatabase, каждому из которых указал перечень параметров из базы, которые он должен отселекчивать. Далее по таймеру (с интервалом в секунду) стартую эти N потоков. Все работает. Ошибок нет, данные считываются из базы и обрабатываются корректно, потоки завершаются корректно.

Проблема в том, что в момент выполнения селекта процессор был загружен в потолок. (процессор многоядерный). С чем это может быть связано? неужели select такой тяжеловесный. Слабо верится, что это нормально.

К слову сказать, что если в методе run() класса ThreadDatabase вместо select наоборот писать (insert) данные (даже в очень больших колличествах), то такой нагрузки на проц не наблюдается даже близко (не более 10%).

У кого какие мысли на этот счет?


Название: Re: БД, select, многопоточность
Отправлено: Rem Norton от Декабрь 07, 2011, 17:15
База на этой же машине крутится?


Название: Re: БД, select, многопоточность
Отправлено: climber от Декабрь 07, 2011, 17:20
Нет, база крутится на физически другом серваке


Название: Re: БД, select, многопоточность
Отправлено: kibsoft от Декабрь 07, 2011, 18:13
Соединение с базой должно быть в том же потоке, где и выполняются запросы. Соответственно то, что в run - это и есть другой поток. А у вас соединение в гуи потоке, а запросы в отдельном. Выход - создать объект, который создает соединение и выполняет запросы, а потом создать его в run.

Цитировать
Threads and the SQL Module
A connection can only be used from within the thread that created it. Moving connections between threads or creating queries from a different thread is not supported.


Название: Re: БД, select, многопоточность
Отправлено: climber от Декабрь 08, 2011, 08:41
Спасибо за помощь!