Вот проблема: допустим, у нас много потоков (> 1000), получающих данные по некоторому протоколу, и я хочу записать эти данные в базу данных (сервер sql).
Для подключения к базе данных мы используем QSqlDatabase
, Согласно документации QSqlDatabase
:
Соединение может использоваться только из потока, который его создал. Перемещение соединений между потоками или создание запросов из другого потока не поддерживается.
Учитывая то, что мы не можем создать 1000 соединений (что может вызвать проблемы с производительностью), какие варианты здесь?
На ум приходит создание отдельного потока для обработки записей в базе данных.
Но как запустить этот поток в фоновом режиме и ожидать сигналов от потоков получения данных? Какие другие подходы могут быть использованы в этой ситуации?
Я использовал соединение с базой данных в качестве глобального регистратора, так что вы можете адаптировать его под свои нужды.
скелет выглядит так:
//Logger.h
class Logger : public QObject
{
Q_OBJECT
...
public:
void log(const QString& msg):
private:
LoggerWorker* w;
QThread t;
}// Logger.cpp
Logger::Logger(QObject* p)
:QObject(p)
{
w = new LoggerWorker;
w->moveToThread(&t);
connect(&t, SIGNAL(started()), w, SLOT(init()));
t.start();
}
...
void
Logger::log(const QString& msg)
{
QMetaObject::invokeMethod(w, "log", Q_ARG(QString, msg));
}
// LoggerWorker.h
class LoggerWorker : public QObject
{
Q_OBJECT
...
public slots:
void init()
{
// create database and connect to it
}
void log(const QString& msg)
{
// insert to database
}
private:
QSqlDatabase db;
}
примечание: приведенный выше код может содержать гайки и ошибки
ура
Лучше всего иметь класс для работы с базой данных, который находится в отдельном потоке. Вы можете выполнять все операции с базой данных в соответствующих слотах. Различные потоки могут взаимодействовать с объектом класса, подключая свои сигналы к его слотам. Поскольку излучатель и приемник существуют в разных потоках, вы будете иметь тип соединения в очереди. Таким образом, различные сигналы, которые испускаются из разных потоков, будут помещены в очередь в классе базы данных, который будет обработан.