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