diff --git a/ZoomPipeline_FuncSvr/database/databaseresource.cpp b/ZoomPipeline_FuncSvr/database/databaseresource.cpp index 665dc3dc155d9e39e184470e7bbc82303a65e840..4e8899837f2e115fcf0b7db1e7b957a06b49c698 100644 --- a/ZoomPipeline_FuncSvr/database/databaseresource.cpp +++ b/ZoomPipeline_FuncSvr/database/databaseresource.cpp @@ -4,6 +4,7 @@ #include #include #include +#include namespace ZPDatabase{ @@ -20,9 +21,9 @@ namespace ZPDatabase{ //Get The quiting thread if (pThread && m_ThreadOwnedMainDBs.contains(pThread) ) { - QSet mainNames = m_ThreadOwnedMainDBs[pThread]; + QMap mainNames = m_ThreadOwnedMainDBs[pThread]; //Remove every thread-owned db names for this thread. - foreach (QString mainName, mainNames) + foreach (QString mainName, mainNames.keys()) { QString threadName = QString("%1_%2").arg(mainName).arg((quint64)pThread); QSqlDatabase db = QSqlDatabase::database(threadName); @@ -48,7 +49,7 @@ namespace ZPDatabase{ * @param strDBName the database name * @return QSqlDatabase return the database object */ - QSqlDatabase DatabaseResource::databse(QString strDBName) + QSqlDatabase DatabaseResource::databse(QString strDBName,bool checkConn) { QMutexLocker locker(&m_mutex_reg); if (false==QSqlDatabase::contains(strDBName)) @@ -85,26 +86,33 @@ namespace ZPDatabase{ //emit evt_Message(this,msg); } m_ThreadsDB[strDBName].insert(threadName); - m_ThreadOwnedMainDBs[pThread].insert(strDBName); + m_ThreadOwnedMainDBs[pThread][strDBName] = QDateTime::currentDateTime(); } //Confirm the thread-owned db is still open QSqlDatabase db = QSqlDatabase::database(threadName); - tagConnectionPara & para = m_dbNames[strDBName]; + + bool bNeedReconnect = false; if (db.isOpen()==true) { - if (para.testSQL.length()) + QDateTime dtmLatsAct = m_ThreadOwnedMainDBs[pThread][strDBName]; + if (dtmLatsAct.addSecs(5) < QDateTime::currentDateTime()) + checkConn = true; + tagConnectionPara & para = m_dbNames[strDBName]; + if (checkConn==true && para.testSQL.length()) { QSqlQuery query(db); query.exec(para.testSQL); if (query.lastError().type()!=QSqlError::NoError) { - QString msg = "Database:"+tr(" Connection ")+threadName+ tr(" confirm failed. MSG="); + QString msg = "Database:"+tr(" Connection ")+threadName+ tr(" Need re-connect. MSG="); msg += query.lastError().text(); qWarning()< & threadOwnedMainDB = m_ThreadOwnedMainDBs[ptr]; + QMap & threadOwnedMainDB = m_ThreadOwnedMainDBs[ptr]; threadOwnedMainDB.remove(mainName); } } diff --git a/ZoomPipeline_FuncSvr/database/databaseresource.h b/ZoomPipeline_FuncSvr/database/databaseresource.h index b03c6013622586854d828d8b2d4bed1c6208f3e6..d3be469037df97debc6a6d892998c8bae5c80cc0 100644 --- a/ZoomPipeline_FuncSvr/database/databaseresource.h +++ b/ZoomPipeline_FuncSvr/database/databaseresource.h @@ -8,6 +8,7 @@ #include #include #include +#include namespace ZPDatabase{ /** * @brief this class provide an database reource pool.In different thread, workers can get existing db connections @@ -39,7 +40,7 @@ namespace ZPDatabase{ //!Get an database connection belong to current thread. //!if database does not exist, it will be added using dbtype - QSqlDatabase databse(QString strDBName); + QSqlDatabase databse(QString strDBName,bool checkConn = false); //!add connection connName, return true if ok. bool addConnection( @@ -66,10 +67,10 @@ namespace ZPDatabase{ protected: bool bTerm; QMutex m_mutex_reg; - QMap m_dbNames; - QMap > m_ThreadsDB; - QMap > m_ThreadOwnedMainDBs; - void RemoveTreadsConnections(QString mainName); + QMap m_dbNames; //Each Main connection Name, and their connection para + QMap > m_ThreadsDB; //Each Main connection Name, and theri thread-owned names + QMap > m_ThreadOwnedMainDBs; //Each Thread owns Main connection Names. + void RemoveTreadsConnections(QString mainName); signals: void evt_Message(QObject *,QString ); public slots: diff --git a/ZoomPipeline_FuncSvr/network/zp_net_threadpool.cpp b/ZoomPipeline_FuncSvr/network/zp_net_threadpool.cpp index 2883c4345e8012569a08cfe8fb49260bff56a581..7e1f2c397e468db359839d077a9d1187873718bf 100644 --- a/ZoomPipeline_FuncSvr/network/zp_net_threadpool.cpp +++ b/ZoomPipeline_FuncSvr/network/zp_net_threadpool.cpp @@ -160,7 +160,7 @@ namespace ZPNetwork{ //emit evt_Message(this,"Info>" + QString(tr("Incomming client arriverd."))); qDebug()<"+QString(tr("Need Trans Thread Object for clients."))); qCritical()<(sender()); emit evt_NewClientConnected(pSock); - //emit evt_Message(pSock,"Info>" + QString(tr("Client connected."))); + emit evt_Message(pSock,"Info>" + QString(tr("Client connected."))); qDebug()<peerAddress().toString()<< pSock->peerPort() < clientList = m_clientList.values(); - + m_mutex_protect.unlock(); foreach(QObject * obj,clientList) { QTcpSocket * pSock = qobject_cast(obj); @@ -438,7 +438,8 @@ namespace ZPNetwork{ } } - m_mutex_protect.unlock(); + //m_clientList.clear(); +// m_mutex_protect.unlock(); } void zp_netTransThread::KickClient(QObject * objClient) diff --git a/ZoomPipeline_FuncSvr/smartlink/st_clientnode_app_imp.cpp b/ZoomPipeline_FuncSvr/smartlink/st_clientnode_app_imp.cpp index 57365f9bacdce7217255db9420c0976c44e51ef7..df63503bfe478125eb6e88e66e52b086e383274d 100644 --- a/ZoomPipeline_FuncSvr/smartlink/st_clientnode_app_imp.cpp +++ b/ZoomPipeline_FuncSvr/smartlink/st_clientnode_app_imp.cpp @@ -102,6 +102,7 @@ namespace ExampleServer{ { //strcpy(reply.TextInfo,"Server Access Error."); emit evt_Message(this,tr("Database Access Error :")+query.lastError().text()); + db.close(); } } else diff --git a/ZoomPipeline_FuncSvr/smartlink/st_clientnode_applayer.cpp b/ZoomPipeline_FuncSvr/smartlink/st_clientnode_applayer.cpp index 4a0a99a28eb9ad7655ce4610c9cc795261838d15..cc90c3f32ea8f1299b2f44f6e40027311485aa3f 100644 --- a/ZoomPipeline_FuncSvr/smartlink/st_clientnode_applayer.cpp +++ b/ZoomPipeline_FuncSvr/smartlink/st_clientnode_applayer.cpp @@ -25,6 +25,7 @@ namespace ExampleServer{ if (false== query.exec()) { emit evt_Message(this,tr("try to get relations Failed! ")+ query.lastError().text()); + db.close(); return false; } @@ -57,6 +58,7 @@ namespace ExampleServer{ if (false== query.exec()) { emit evt_Message(this,tr("try to del old relations Failed! ")+ query.lastError().text()); + db.close(); return false; } @@ -77,6 +79,7 @@ namespace ExampleServer{ if (false== query.exec()) { emit evt_Message(this,tr("try to insert new relations Failed! ")+ query.lastError().text()); + db.close(); return false; } }