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命令都放到这个线程池中处理。
在此感谢网络大牛
参考地址:
http://blog.csdn.net/goldenhawking/article/details/10811409
http://blog.chinaunix.net/uid-20680966-id-4779621.html
时间: 2024-10-28 23:35:42