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
