我编写了以下代码以便进行并发查询。
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'是 仍在使用中,所有查询都将停止工作。
答案 0 :(得分:1)
当您在每个线程中创建新连接时,从Qt的角度来看它完全没问题,应该删除与连接相关的查询对象,这样避免此消息的最简单方法是这样的:
compileSdkVersion 22
所以只需限制QSqlQuery的范围,然后在关闭连接之前将其销毁。
答案 1 :(得分:0)
此外,在查询存在时,连接必须保持打开状态;否则,QSqlQuery的行为是未定义的。
因此,您的代码必须在关闭数据库连接之前处理查询。这可能是你的注意力泄漏。
另请注意,您的数据库驱动程序可能不支持并发。我在某处读到了一些关于此的内容,但此刻无法回想起。