出現這個告警是由於打開了多個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
===================================