qt 多線程訪問數據庫問題


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM