1. 程式人生 > >qt資料庫多執行緒問題的解決(QSqlDatabase 同一個連線只能在建立它的執行緒中使用)

qt資料庫多執行緒問題的解決(QSqlDatabase 同一個連線只能在建立它的執行緒中使用)

注意:連線名和資料庫名是完全兩樣東西

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命令都放到這個執行緒池中處理。

作者:帥得不敢出門  程式設計師群:31843264

http://blog.chinaunix.net/uid-20680966-id-4779621.html