Russian Qt Forum

Qt => Базы данных => Тема начата: vebmaster от Февраль 02, 2017, 12:36



Название: Как лучше спроектировать при работе с потоками
Отправлено: vebmaster от Февраль 02, 2017, 12:36
Здравствуйте.
Делаю программу, которая будет работать с mysql в многопоточном режиме, потоков может быть много и 5 и 10 и 100. В каждом потоке будет обращение на чтение/запись к базе.
+ обращение будет из других объектов классов.
Сейчас имеется отдельный класс "mySql" (в нём устанавливается соединение с базой и прописаны все функции с запросами), экземпляр которого создаётся в рабочем классе, объект которого и помещается в поток. Но так же требуется работать с базой в других классах.

Не знаю как правильно спроектировать программу для работы с базой. Правильно ли я сделал или нет? Или лучше использовать 1 соединение (static QSqlDatabase db) на всю программу или это всё мелочи?


Название: Re: Как лучше спроектировать при работе с потоками
Отправлено: vebmaster от Февраль 02, 2017, 15:52
ответ на мой вопрос описан в http://www.prog.org.ru/topic_29975_0.html
всё правильно сделал


Название: Re: Как лучше спроектировать при работе с потоками
Отправлено: vebmaster от Февраль 06, 2017, 14:37
И всё таки переделал на работу с одним соединением.
Т.к. QSqlDatabase уже синглтон, то достаточно заменить
Код:
db = QSqlDatabase::addDatabase("QMYSQL");
на
Код:
    if (QSqlDatabase::contains(QSqlDatabase::defaultConnection))
        db = QSqlDatabase::database();
    else
        db = QSqlDatabase::addDatabase("QMYSQL");

а в заголовочном файле даже не нужен static
Код:
QSqlDatabase db;


Название: Re: Как лучше спроектировать при работе с пот
Отправлено: vebmaster от Февраль 09, 2017, 13:34
для тех кто наткнулся на данный топик.
Инициализацию QSqlDatabase объекта делаем один раз в конструкторе.
Если планируется несколько соединений из разных потоков, для каждого потока всё такие лучше создавать отдельное именованное соединение.
Соединяться с базой надо прям перед запросом (exec()) и после запроса закрывать соединение.