1

这是问题所在:假设我们有很多线程(> 1000)通过某种协议接收数据,我想将这些数据写入数据库(sql server)。

对于数据库连接,我们使用QSqlDatabase. 根据以下文件QSqlDatabase

只能在创建它的线程内使用连接。不支持在线程之间移动连接或从不同线程创建查询。

考虑到我们不能创建 1000 个连接(这会导致性能问题),这里有哪些选项?

想到的是为数据库写入处理创建一个单独的线程。

但是如何在后台运行这个线程并等待来自数据接收线程的信号呢?在这种情况下可以使用哪些其他方法?

4

2 回答 2

1

最好的选择是有一个用于处理数据库的类,它驻留在单独的线程中。您可以在相关插槽中执行所有与数据库相关的操作。不同的线程可以通过将它们的信号连接到它的槽来与类的对象进行交互。由于发射器和接收器存在于不同的线程中,因此您将拥有一个排队的连接类型。因此,从不同线程发出的不同信号将在数据库类中排队等待处理。

于 2015-02-18T16:40:27.817 回答
1

我将数据库连接用作全局记录器,因此您可以对其进行调整以满足您的需求。骨架看起来像:

    //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;
}

注意:上面的代码可能包含坚果和错误

干杯

于 2015-02-18T14:45:11.107 回答