Qt数据库由QSqlDatabase::addDatabase()生成的QSqlDatabase只能在创建它的线程中使用, 在多线程中共用连接或者在另外一个线程中创建query都是不支持的
假设有如下代码:
bool openDatabase()
{
QSqlDatabase db;
QString connectionName = "sqlite";
db = QSqlDatabase::addDatabase("QSQLITE", connectionName);
db.setDatabaseName("/jyxtec.db");
if (db.open()) return true;
else return false;
}
void testQuery()
{
QSqlQuery query(QSqlDatabase::database("sqlite"));
query.exec("SELECT * from t_test");
}
这里的testQuery()是不支持多线程调用的,只能在调用OpenDatabase()的线程中使用.否则很容易段错误。
解决方法有两种:
1)每个调用testQuery的线程中创建不同connectionName的QSqlDatabase
比如线程A
QSqlDatabase::addDatabase("QSQLITE", "A");
QSqlQuery query(QSqlDatabase::database("A"));
线程B
QSqlDatabase::addDatabase("QSQLITE", "B");
QSqlQuery query(QSqlDatabase::database("B"));
2)实现一个数据库线程池,创建N个不同connectionName的QSqlDatabase,所有的query命令都放到这个线程池中处理。
在此感谢网络大牛
参考地址:
/goldenhawking/article/details/10811409
/uid-20680966-id-4779621.html
如果觉得《qt多线程适用mysql_qt 多线程访问数据库问题》对你有帮助,请点赞、收藏,并留下你的观点哦!