При написании мультисервисной системы, в которой каждый сервис должен быть многопоточным, мы столкнулись с проблемой использования подключения к базе данных.
Сервисы разрабатываются на QT, поэтому для взаимодействия с базой данных мы использовали модуль QtSql.
Проблемы
- Каждому потоку требуется собственное подключение к базе данных (QSqlDatabase).
При использовании одного соединения из разных потоков возникает ошибка сегментации.
- Т.
к.
в настоящее время есть возможность держать открытым ограниченное количество подключений к базе данных; необходимо реализовать захват, освобождение и ожидание соединений потоками.
- В контексте потока для корректной работы транзакциям достаточно работать только с одним соединением.
Например: Сущность «Заказ» содержит сущность «Продукт».
При сохранении Заказа все товары должны быть сохранены.
Если при сохранении товара возникает исключение, всю транзакцию по сохранению заказа необходимо отменить.
- Библиотека должна уметь работать одновременно с несколькими базами данных разных типов (Mysql, PostgreSQL).
Решение
В результате у нас получилось 3 класса:- Связь — класс-обертка, отвечающий за работу с базой данных: подключение, выполнение и обработку результатов запроса.
- Диспетчер соединений — синглтон, который скрывает соединения внутри себя и отвечает за выдачу и освобождение соединений.
- Управляемое соединение — класс-оболочка для автоматизации захвата и освобождения соединения.
Связь
В конструкторе класса инициализируется член QSqlDatabase _conn и открывается соединение:Теги: #базы данных #Qt #C++Connection::Connection(const QString& ident, const QString& driver,
-
Как Часто Вы Что-То Продаете?
19 Oct, 24 -
Подходы К Подключению Iot-Устройств К Сети
19 Oct, 24 -
«Веб-Наука» Признана Отраслью Знаний
19 Oct, 24