提交 45360d0b 编写于 作者: 丁劲犇's avatar 丁劲犇 😸

Add a thread to confirm every db connections periodicly.

上级 106bb87d
......@@ -4,8 +4,9 @@
#include <QSqlError>
namespace ZPDatabase{
DatabaseResource::DatabaseResource(QObject *parent) :
QObject(parent)
QThread(parent)
{
bTerm = false;
}
//!Get an database connection belong to current thread.
//!if database does not exist, it will be added using dbtype
......@@ -22,7 +23,12 @@ QSqlDatabase DatabaseResource::databse(const QString & strDBName)
}
void DatabaseResource::remove_connections()
{
QMap<QString,tagConnectionPara> sets = currentDatabaseConnections();
QMap<QString,tagConnectionPara> sets;
{
QMutexLocker locker(&m_mutex_reg);
sets = currentDatabaseConnections();
}
foreach (QString name, sets.keys())
this->remove_connection(name);
}
......@@ -69,6 +75,7 @@ bool DatabaseResource::addConnection(
para.dbName = dbName;
para.User = User;
para.Pass = Pass;
para.status = true;
para.ExtraOptions = ExtraOptions;
if (true==QSqlDatabase::contains(connName))
......@@ -107,7 +114,7 @@ bool DatabaseResource::confirmConnection (const QString & connName)
emit evt_Message(msg);
return false;
}
const tagConnectionPara & para = m_dbNames[connName];
tagConnectionPara & para = m_dbNames[connName];
if (true==QSqlDatabase::contains(connName) )
{
QSqlDatabase db = QSqlDatabase::database(connName);
......@@ -123,11 +130,17 @@ bool DatabaseResource::confirmConnection (const QString & connName)
db.setPassword(para.Pass);
db.setConnectOptions(para.ExtraOptions);
if (db.open()==true)
{
para.status = true;
para.lastError = "";
return true;
}
QSqlDatabase::removeDatabase(connName);
msg = tr(" Connection ")+connName+ tr(" Can't be opened. MSG=");
msg += db.lastError().text();
emit evt_Message(msg);
para.status = false;
para.lastError = db.lastError().text();
return false;
}
......@@ -139,11 +152,40 @@ bool DatabaseResource::confirmConnection (const QString & connName)
db.setPassword(para.Pass);
db.setConnectOptions(para.ExtraOptions);
if (db.open()==true)
{
para.status = true;
para.lastError = "";
return true;
}
QString msg = tr(" Connection ")+connName+ tr(" Can't be opened. MSG=");
msg += db.lastError().text();
emit evt_Message(msg);
QSqlDatabase::removeDatabase(connName);
para.status = false;
para.lastError = db.lastError().text();
return false;
}
void DatabaseResource::run()
{
while(bTerm==false)
{
QMap<QString,tagConnectionPara> sets;
{
QMutexLocker locker(&m_mutex_reg);
sets = currentDatabaseConnections();
}
foreach (QString name, sets.keys())
{
confirmConnection(name) ;
if (bTerm==true)
break;
}
if (bTerm==false)
QThread::currentThread()->msleep(30000);
}
}
};
......@@ -6,11 +6,12 @@
#include <QSqlDatabase>
#include <QString>
#include <QMutex>
#include <QThread>
//!this class provide an database reource,
//!In different thread, workers can get existing db connections
//! immediately without re-creation operations.
namespace ZPDatabase{
class DatabaseResource : public QObject
class DatabaseResource : public QThread
{
Q_OBJECT
public:
......@@ -23,8 +24,8 @@ public:
QString User;
QString Pass;
QString ExtraOptions;
bool status;
QString lastError;
} ;
public:
......@@ -49,9 +50,14 @@ public:
void remove_connections();
bool confirmConnection (const QString & connName);
const QMap <QString,tagConnectionPara> & currentDatabaseConnections(){return m_dbNames;}
QMap <QString,tagConnectionPara> currentDatabaseConnections(){return m_dbNames;}
void run();
void TerminateMe(){bTerm = true;}
protected:
bool bTerm;
QMutex m_mutex_reg;
QMap <QString,tagConnectionPara> m_dbNames;
signals:
......
......@@ -6,6 +6,7 @@
#include <QMessageBox>
#include <QFileDialog>
#include <QSqlDatabase>
#include <QMap>
using namespace ZPNetwork;
using namespace ZPTaskEngine;
ZPMainFrame::ZPMainFrame(QWidget *parent) :
......@@ -27,6 +28,7 @@ ZPMainFrame::ZPMainFrame(QWidget *parent) :
//Create databases
m_pDatabases = new ZPDatabase::DatabaseResource(this);
connect (m_pDatabases,&ZPDatabase::DatabaseResource::evt_Message,this,&ZPMainFrame::on_evt_Message);
m_pDatabases->start();
m_nTimerId = startTimer(500);
......@@ -39,10 +41,13 @@ ZPMainFrame::~ZPMainFrame()
m_netEngine->RemoveAllAddresses();
m_netEngine->KickAllClients();
m_netEngine->DeactiveImmediately();
//term the confirm check
m_pDatabases->TerminateMe();
m_pDatabases->remove_connections();
m_taskEngine->removeThreads(-1);
while (m_netEngine->CanExit()==false || m_taskEngine->canClose()==false)
while (m_netEngine->CanExit()==false || m_taskEngine->canClose()==false
|| m_pDatabases->isRunning()==true)
{
QCoreApplication::processEvents();
QThread::currentThread()->msleep(200);
......@@ -141,6 +146,20 @@ void ZPMainFrame::timerEvent(QTimerEvent * e)
str_msg += tr("Current Task Threads: %1\n").arg(m_taskEngine->threadsCount());
str_msg += tr("Current Task Payload: %1\n").arg(m_taskEngine->payload());
str_msg += tr("Current Task Idle Threads: %1\n").arg(m_taskEngine->idleThreads());
QMap<QString,ZPDatabase::DatabaseResource::tagConnectionPara> map_conns
= m_pDatabases->currentDatabaseConnections();
str_msg += tr("Database Connections: %1\n").arg(map_conns.size());
foreach (QString name,map_conns.keys() )
{
ZPDatabase::DatabaseResource::tagConnectionPara & para = map_conns[name];
str_msg += tr("\t%1 status = %2").arg(name).arg(para.status);
if (para.status==false)
str_msg += ", Msg=" + para.lastError;
str_msg += "\n";
}
ui->plainTextEdit_status_net->setPlainText(str_msg);
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册