标题:Qt多个线程访问数据库问题
作者:行走的李屁娃
日期:2022-08-06 19:09
内容:
需求描述:在线程A、线程B写入数据到数据库,窗口C在主线程获取数据库数据
目前做法:在线程C维护数据库db对象,线程AB数据通过信号与槽发送给线程C,在线程C执行数据库操作
想知道有什么更好的办法,这样的处理办法维护了太多的信号与槽,很烦
#1 [feng851 08-08 08:29]
那就要看看你的线程A与线程B的是做什么业务了。感觉上,你是为了业务解耦分了这两个线程,而你通过信号传递给主线程操作数据库,可能是因为数据库是单线程文件型又或是为了保证数据库操作的原子性。没什么大问题啊,个人觉得,你的线程A和线程B也可以通过信号和slot放在主线程内处理
#2 [tanyue.esec 08-08 08:32]
感觉AB线程写入数据库,C线程读取数据库,天然就分开了,没必要搞个什么信号了。
主要是不了解ABC都是什么业务
#3 [yeguoxiong 08-10 17:06]
可以试一下,用完数据库就关闭。这样可以不用考虑多线程
#4 [yeguoxiong 08-10 17:08]
const QString &connectionName = QString("%1%2").arg(metaObject()->className()).arg(QRandomGenerator::global()->generate());
if(true)
{
const DatabaseStruct &m_dbStruct = DataServices::instance()->dbStruct();
QSqlDatabase db = QSqlDatabase::addDatabase(m_dbStruct.type, connectionName);
db.setHostName(m_dbStruct.hostName);
db.setDatabaseName(m_dbStruct.dbName);
db.setUserName(m_dbStruct.userName);
db.setPassword(m_dbStruct.password);
db.setPort(m_dbStruct.port);
if(db.open())
{
QSqlQuery query(db);
query.prepare("SELECT COUNT(1) FROM g_t_devices WHERE LOCATE(?,IFNULL(areaToken,''))>0 LIMIT 1");
query.addBindValue(projectId);
query.exec();
while(query.next())
{
qDebug()addErrorLog(QStringLiteral("[数据管理]%1数据库打开出错,Error:%2。").arg(metaObject()->className()).arg(db.lastError().text()));
}
db.close();
}
QSqlDatabase::removeDatabase(connectionName);
#5 [angelus 08-11 10:32]
线程A独立写入数据A; 发送信号 告诉C ,写完了
线程B独立写入数据B; 发送信号 告诉C,写完了
线程C,接到信号,就去数据库读,更新界面
写数据的类需要你自己处理下,加入一下写同步锁就行了.
线程里边的逻辑尽量封装独立,只抽象几个简单信号通知外界.这样你维护起来也简单