QThread 向数据库发送大型查询

Posted

技术标签:

【中文标题】QThread 向数据库发送大型查询【英文标题】:QThread to send large queries to the database 【发布时间】:2009-02-11 13:01:25 【问题描述】:

我创建了这个继承自 QThread 的类,用于向数据库服务器发送数据,你怎么看?可以改进吗?

谢谢

#ifndef QUERYTHREAD_H
#define QUERYTHREAD_H

#包括

类 QSqlQuery;

类查询线程:公共 QThread 
    公共插槽:
        bool exec(QSqlQuery *query, Priority priority=InheritPriority);
    受保护:
        虚空运行();
    私人的:
        布尔 m_hasError;
        QSqlQuery *q;
;

#endif // QUERYTHREAD_H
#include "querythread.h"

#包括
#包括

bool QueryThread::exec(QSqlQuery *query, Priority 优先级)

    q=查询;
    开始(优先级);
    while(isRunning()) qApp->processEvents();
    返回 m_hasError;


无效查询线程::运行()
 m_hasError=q->exec(); 

【问题讨论】:

【参考方案1】:

几点意见:

exec 中的 while 循环消除了拥有单独线程的优势。您应该在构造函数中传入查询,每个查询有一个线程,不要覆盖exec,宁愿只使用start 并使用信号异步报告任何错误。

您还应该按值传递 QSqlQuery 或将其存储在托管指针中,例如 std::auto_ptr(或 C++11 的 std::unique_ptr)。许多 Qt 类是 implicitly shared(虽然不是这个),但托管指针可以为您提供异常安全性。

就个人而言,我会简单地做这样的事情

class Query : public QThread 

    QSqlQuery m_query;
    // I prefer values unless there's a particular reason to use pointers.

public:

    Query (const QSqlQuery & query)
    : m_query (query)
    
    

    void run ()
    
        emit finished (m_query .exec ());
        deleteLater ();
    

public signals:

    void finished (bool);
;

Query * q = new Query ("SELECT foo FROM bar");

connect (q, SIGNAL (finished (bool), ...);

q -> start ();

【讨论】:

以上是关于QThread 向数据库发送大型查询的主要内容,如果未能解决你的问题,请参考以下文章

如何向 Qt 中 QThread 类的特定对象发出信号?

QThread 没有启动

使用实体框架提高大型查询的性能 [重复]

Django 和 AngularJS - 向 Angular 发送查询 JSON 数据

在大型更新时从 mysql 触发器向 gearman 发送作业

使用Criteria API的Hibernate向数据库发送了太多查询