Название: БД, 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 Спасибо за помощь!
|