不同线程

时间:2016-07-03 11:17:09

标签: database multithreading qt memory-leaks

我编写了以下代码以便进行并发查询。

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:connection'DB-ReplyThread-1'是   仍在使用中,所有查询都将停止工作。

2 个答案:

答案 0 :(得分:1)

当您在每个线程中创建新连接时,从Qt的角度来看它完全没问题,应该删除与连接相关的查询对象,这样避免此消息的最简单方法是这样的:

compileSdkVersion 22

所以只需限制QSqlQuery的范围,然后在关闭连接之前将其销毁。

答案 1 :(得分:0)

引用documentation

  

此外,在查询存在时,连接必须保持打开状态;否则,QSqlQuery的行为是未定义的。

因此,您的代码必须在关闭数据库连接之前处理查询。这可能是你的注意力泄漏。

另请注意,您的数据库驱动程序可能不支持并发。我在某处读到了一些关于此的内容,但此刻无法回想起。