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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: БД, select, многопоточность  (Прочитано 3922 раз)
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%).

У кого какие мысли на этот счет?
Записан
Rem Norton
Гость
« Ответ #1 : Декабрь 07, 2011, 17:15 »

База на этой же машине крутится?
Записан
climber
Гость
« Ответ #2 : Декабрь 07, 2011, 17:20 »

Нет, база крутится на физически другом серваке
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #3 : Декабрь 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.
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
climber
Гость
« Ответ #4 : Декабрь 08, 2011, 08:41 »

Спасибо за помощь!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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