提交 3a883c97 编写于 作者: 丁劲犇's avatar 丁劲犇 😸

Merge branch 'master' of git@github.com:goldenhawking/zpserver.git

......@@ -4,6 +4,7 @@
#include <QSqlError>
#include <QSqlQuery>
#include <QDebug>
#include <QDateTime>
namespace ZPDatabase{
......@@ -20,9 +21,9 @@ namespace ZPDatabase{
//Get The quiting thread
if (pThread && m_ThreadOwnedMainDBs.contains(pThread) )
{
QSet<QString> mainNames = m_ThreadOwnedMainDBs[pThread];
QMap<QString, QDateTime> 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()<<msg;
emit evt_Message(this,msg);
bNeedReconnect = true;
}
else
m_ThreadOwnedMainDBs[pThread][strDBName] = QDateTime::currentDateTime();
}
if (bNeedReconnect==true)
{
......@@ -115,7 +123,12 @@ namespace ZPDatabase{
}
}
else
{
QSqlDatabase::removeDatabase(threadName);
m_ThreadsDB[strDBName].remove(threadName);
m_ThreadOwnedMainDBs[pThread].remove(strDBName);
bNeedReconnect = true;
}
if (bNeedReconnect==true)
{
db = QSqlDatabase::cloneDatabase(QSqlDatabase::database(strDBName),threadName);
......@@ -125,7 +138,7 @@ namespace ZPDatabase{
emit evt_Message(this,msg);
qDebug()<<msg;
m_ThreadsDB[strDBName].insert(threadName);
m_ThreadOwnedMainDBs[pThread].insert(strDBName);
m_ThreadOwnedMainDBs[pThread][strDBName] = QDateTime::currentDateTime();
}
else
{
......@@ -198,7 +211,7 @@ namespace ZPDatabase{
//Remove thread map.
foreach (QThread * ptr, m_ThreadOwnedMainDBs.keys())
{
QSet<QString> & threadOwnedMainDB = m_ThreadOwnedMainDBs[ptr];
QMap<QString, QDateTime> & threadOwnedMainDB = m_ThreadOwnedMainDBs[ptr];
threadOwnedMainDB.remove(mainName);
}
}
......
......@@ -8,6 +8,7 @@
#include <QMutex>
#include <QThread>
#include <QSet>
#include <QDateTime>
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 <QString,tagConnectionPara> m_dbNames;
QMap <QString, QSet<QString> > m_ThreadsDB;
QMap <QThread * , QSet<QString> > m_ThreadOwnedMainDBs;
void RemoveTreadsConnections(QString mainName);
QMap <QString,tagConnectionPara> m_dbNames; //Each Main connection Name, and their connection para
QMap <QString, QSet<QString> > m_ThreadsDB; //Each Main connection Name, and theri thread-owned names
QMap <QThread * , QMap<QString,QDateTime> > m_ThreadOwnedMainDBs; //Each Thread owns Main connection Names.
void RemoveTreadsConnections(QString mainName);
signals:
void evt_Message(QObject *,QString );
public slots:
......
......@@ -160,7 +160,7 @@ namespace ZPNetwork{
//emit evt_Message(this,"Info>" + QString(tr("Incomming client arriverd.")));
qDebug()<<tr("Incomming client arriverd.");
//m_mutex_trans.lock();
int nsz = m_vec_NetTransThreads.size();
int nMinPay = 0x7fffffff;
int nMinIdx = -1;
......@@ -192,7 +192,7 @@ namespace ZPNetwork{
emit evt_Message(this,"Warning>"+QString(tr("Need Trans Thread Object for clients.")));
qCritical()<<tr("Need Trans Thread Object for clients.");
}
//m_mutex_trans.unlock();
}
/**
* @brief This is a slot function. when a listening thread is terminated,
......
......@@ -245,7 +245,7 @@ namespace ZPNetwork{
{
QTcpSocket * pSock = qobject_cast<QTcpSocket*>(sender());
emit evt_NewClientConnected(pSock);
//emit evt_Message(pSock,"Info>" + QString(tr("Client connected.")));
emit evt_Message(pSock,"Info>" + QString(tr("Client connected.")));
qDebug()<<pSock->peerAddress().toString()<<
pSock->peerPort() <<tr("(%1)..connected.").arg((quint64)pSock);
}
......@@ -410,7 +410,7 @@ namespace ZPNetwork{
return;
m_mutex_protect.lock();
QList<QObject *> clientList = m_clientList.values();
m_mutex_protect.unlock();
foreach(QObject * obj,clientList)
{
QTcpSocket * pSock = qobject_cast<QTcpSocket*>(obj);
......@@ -438,7 +438,8 @@ namespace ZPNetwork{
}
}
m_mutex_protect.unlock();
//m_clientList.clear();
// m_mutex_protect.unlock();
}
void zp_netTransThread::KickClient(QObject * objClient)
......
......@@ -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
......
......@@ -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;
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册