Использование Соединений С Субд В Многопоточных Приложениях Qt

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

Сервисы разрабатываются на QT, поэтому для взаимодействия с базой данных мы использовали модуль QtSql.



Проблемы

  1. Каждому потоку требуется собственное подключение к базе данных (QSqlDatabase).

    При использовании одного соединения из разных потоков возникает ошибка сегментации.

  2. Т.

    к.

    в настоящее время есть возможность держать открытым ограниченное количество подключений к базе данных; необходимо реализовать захват, освобождение и ожидание соединений потоками.

  3. В контексте потока для корректной работы транзакциям достаточно работать только с одним соединением.

    Например: Сущность «Заказ» содержит сущность «Продукт».

    При сохранении Заказа все товары должны быть сохранены.

    Если при сохранении товара возникает исключение, всю транзакцию по сохранению заказа необходимо отменить.

  4. Библиотека должна уметь работать одновременно с несколькими базами данных разных типов (Mysql, PostgreSQL).



Решение

В результате у нас получилось 3 класса:
  • Связь — класс-обертка, отвечающий за работу с базой данных: подключение, выполнение и обработку результатов запроса.

  • Диспетчер соединений — синглтон, который скрывает соединения внутри себя и отвечает за выдачу и освобождение соединений.

  • Управляемое соединение — класс-оболочка для автоматизации захвата и освобождения соединения.



Связь
В конструкторе класса инициализируется член QSqlDatabase _conn и открывается соединение:
   

Connection::Connection(const QString& ident, const QString& driver,

Теги: #базы данных #Qt #C++
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.