2016-07-03 30 views
0

同時クエリを行うために、以下のコードを記述しました。異なるスレッドでのQSqlDatabase同時クエリ

QString databaseName = "DB-"+QThread::currentThread()->objectName(); 
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL",databaseName); 
db.setHostName("192.168.1.2"); 
db.setDatabaseName("Behroozi"); 
db.setUserName("root"); 
db.setPassword("password"); 
db.open(); 

QSqlQuery query(db); 
query.prepare("select * from Person where chatID=:chatID"); 
query.bindValue(":chatID",chatID); 
if(query.exec()) 
    return true;  

db.close(); 
QSqlDatabase::removeDatabase(databaseName); 

コードは、一意の名前で接続を作成し、それを開き、クエリを作成し、最後に接続を削除します。

問題は、メモリリークがあります。私がコードにコメントするとき、それは漏れません。それを防ぐために他に何をすべきですか?

私が書いた安全なコードですか?

私はdb.close()リターンをremoveDatabaseコピーした場合、それが印刷されます:

QSqlDatabasePrivate :: removeDatabase:接続 'DB-ReplyThread-1' をまだで ですすべてのクエリが機能しなくなります。 documentationを引用する

+0

メモリリークがあることをどのように知っていますか? Process Explorerのメモリ使用量が増加しますか? – sashoalm

答えて

0

あなたは各ビューのQtの点から、その完全に罰金をスレッドで新しい接続を作成したようなので、このメッセージを回避する最も簡単な方法は、このようなもので、接続に関連するオブジェクトを削除する必要があり問い合せますので

.... 
do { 
    QSqlQuery query(db); 
    query.prepare("select * from Person  where chatID=:chatID"); 
    query.bindValue(":chatID",chatID); 
    if(query.exec()) 
     break;  
} while (0); 

db.close(); 

....  
    QSqlDatabase::removeDatabase(databaseName); 

QSqlQueryの範囲を制限するだけで、接続を閉じる前に破棄されます。

0

クエリが存在している間も、接続が開いたままにしなければなりません。それ以外の場合、QSqlQueryの動作は未定義です。

データベース接続を閉じる前に、コードでクエリを処理する必要があります。それはあなたの気づいた漏れかもしれません。


また、データベースドライバが並行処理をサポートしていない可能性があります。私はそれについて何かを読んだが、現時点では思い出すことはできない。

関連する問題