出现这个告警是由于打开了多个db而没有及时关闭,网上搜了答案是使用完了执行mysql
QSqlDatabase::removeDatabase(m_connectionName);linux
泄漏的问题有所改善,但点快了仍然有问题,研究了本身的代码才发现,原来本身每次 query时都open一下,即便每次查完后都关闭也来不及的。sql
将open 和 close函数放在构造和析构中执行;问题解决;函数
openSQLspa
void Worker::openDatabase() { QDateTime dateTime = QDateTime::currentDateTime(); QString m_dbName = "zzz"; m_connectionName = "m_dbName"; m_connectionName += dateTime.toString("_yyyyMMdd_hhmmss"); m_db = QSqlDatabase::addDatabase("QMYSQL", m_connectionName); if (!m_db.isValid()) { qDebug()<<"openDatabase not valid"; return ; } m_db.setHostName("localhost"); m_db.setUserName("root"); m_db.setPassword("root"); m_db.setDatabaseName(m_dbName); if (!m_db.open()) { qDebug()<<"openDatabase not open"; return ; } m_query = new QSqlQuery(m_db); }
closeSQL.net
void Worker::closeDatabase() { if(m_query != NULL ) { delete m_query; m_query = NULL; } if (m_db.isValid()) { if (m_db.isOpen()) m_db.close(); m_db = QSqlDatabase::database("", false); QSqlDatabase::removeDatabase(m_connectionName); } qDebug()<<"closed;"; }
最后是工做函数code
void Worker::slot1() { QString str = "delete from test where id > 300000 "; QString str1 = "UPDATE test SET content = 'Checked' WHERE content = 'Wilson' "; QString str2 = "update test set content = 'zero.' where content > '10000' "; qDebug()<<"3 slots1 : "<<QThread::currentThreadId(); tmpTime.start(); m_db.transaction(); for (int i = 0 ; i < 100000 ; i++ ) { QString str3 = QString("insert into test(content) values('[Checked]')"); m_query->exec(str3); globalVar++; } m_query->exec(str1); m_query->exec(str2); m_query->exec(str); m_db.commit(); qDebug()<<"Time Elapsed: "<<tmpTime.elapsed()<<" ms"; #if 0 while(m_query->next()) //query.next()指向查找到的第一条记录,而后每次后移一条记录 { int ele0 = m_query->value(0).toInt(); QString ele1 =m_query->value(1).toString(); QString ele2 = m_query->value(2).toString(); qDebug() << ele0 <<ele1 <<ele2 ; } #endif qDebug()<<"query done."; emit sig1(); }
1, Developing utilities.htm
2, Wellknown linuxcblog
3,. wellknown qtrem
===================================