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

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

...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include <QSqlError> #include <QSqlError>
#include <QSqlQuery> #include <QSqlQuery>
#include <QDebug> #include <QDebug>
#include <QDateTime>
namespace ZPDatabase{ namespace ZPDatabase{
...@@ -20,9 +21,9 @@ namespace ZPDatabase{ ...@@ -20,9 +21,9 @@ namespace ZPDatabase{
//Get The quiting thread //Get The quiting thread
if (pThread && m_ThreadOwnedMainDBs.contains(pThread) ) 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. //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); QString threadName = QString("%1_%2").arg(mainName).arg((quint64)pThread);
QSqlDatabase db = QSqlDatabase::database(threadName); QSqlDatabase db = QSqlDatabase::database(threadName);
...@@ -48,7 +49,7 @@ namespace ZPDatabase{ ...@@ -48,7 +49,7 @@ namespace ZPDatabase{
* @param strDBName the database name * @param strDBName the database name
* @return QSqlDatabase return the database object * @return QSqlDatabase return the database object
*/ */
QSqlDatabase DatabaseResource::databse(QString strDBName) QSqlDatabase DatabaseResource::databse(QString strDBName,bool checkConn)
{ {
QMutexLocker locker(&m_mutex_reg); QMutexLocker locker(&m_mutex_reg);
if (false==QSqlDatabase::contains(strDBName)) if (false==QSqlDatabase::contains(strDBName))
...@@ -85,26 +86,33 @@ namespace ZPDatabase{ ...@@ -85,26 +86,33 @@ namespace ZPDatabase{
//emit evt_Message(this,msg); //emit evt_Message(this,msg);
} }
m_ThreadsDB[strDBName].insert(threadName); m_ThreadsDB[strDBName].insert(threadName);
m_ThreadOwnedMainDBs[pThread].insert(strDBName); m_ThreadOwnedMainDBs[pThread][strDBName] = QDateTime::currentDateTime();
} }
//Confirm the thread-owned db is still open //Confirm the thread-owned db is still open
QSqlDatabase db = QSqlDatabase::database(threadName); QSqlDatabase db = QSqlDatabase::database(threadName);
tagConnectionPara & para = m_dbNames[strDBName];
bool bNeedReconnect = false; bool bNeedReconnect = false;
if (db.isOpen()==true) 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); QSqlQuery query(db);
query.exec(para.testSQL); query.exec(para.testSQL);
if (query.lastError().type()!=QSqlError::NoError) 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(); msg += query.lastError().text();
qWarning()<<msg; qWarning()<<msg;
emit evt_Message(this,msg); emit evt_Message(this,msg);
bNeedReconnect = true; bNeedReconnect = true;
} }
else
m_ThreadOwnedMainDBs[pThread][strDBName] = QDateTime::currentDateTime();
} }
if (bNeedReconnect==true) if (bNeedReconnect==true)
{ {
...@@ -115,7 +123,12 @@ namespace ZPDatabase{ ...@@ -115,7 +123,12 @@ namespace ZPDatabase{
} }
} }
else else
{
QSqlDatabase::removeDatabase(threadName);
m_ThreadsDB[strDBName].remove(threadName);
m_ThreadOwnedMainDBs[pThread].remove(strDBName);
bNeedReconnect = true; bNeedReconnect = true;
}
if (bNeedReconnect==true) if (bNeedReconnect==true)
{ {
db = QSqlDatabase::cloneDatabase(QSqlDatabase::database(strDBName),threadName); db = QSqlDatabase::cloneDatabase(QSqlDatabase::database(strDBName),threadName);
...@@ -125,7 +138,7 @@ namespace ZPDatabase{ ...@@ -125,7 +138,7 @@ namespace ZPDatabase{
emit evt_Message(this,msg); emit evt_Message(this,msg);
qDebug()<<msg; qDebug()<<msg;
m_ThreadsDB[strDBName].insert(threadName); m_ThreadsDB[strDBName].insert(threadName);
m_ThreadOwnedMainDBs[pThread].insert(strDBName); m_ThreadOwnedMainDBs[pThread][strDBName] = QDateTime::currentDateTime();
} }
else else
{ {
...@@ -198,7 +211,7 @@ namespace ZPDatabase{ ...@@ -198,7 +211,7 @@ namespace ZPDatabase{
//Remove thread map. //Remove thread map.
foreach (QThread * ptr, m_ThreadOwnedMainDBs.keys()) foreach (QThread * ptr, m_ThreadOwnedMainDBs.keys())
{ {
QSet<QString> & threadOwnedMainDB = m_ThreadOwnedMainDBs[ptr]; QMap<QString, QDateTime> & threadOwnedMainDB = m_ThreadOwnedMainDBs[ptr];
threadOwnedMainDB.remove(mainName); threadOwnedMainDB.remove(mainName);
} }
} }
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <QMutex> #include <QMutex>
#include <QThread> #include <QThread>
#include <QSet> #include <QSet>
#include <QDateTime>
namespace ZPDatabase{ namespace ZPDatabase{
/** /**
* @brief this class provide an database reource pool.In different thread, workers can get existing db connections * @brief this class provide an database reource pool.In different thread, workers can get existing db connections
...@@ -39,7 +40,7 @@ namespace ZPDatabase{ ...@@ -39,7 +40,7 @@ namespace ZPDatabase{
//!Get an database connection belong to current thread. //!Get an database connection belong to current thread.
//!if database does not exist, it will be added using dbtype //!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. //!add connection connName, return true if ok.
bool addConnection( bool addConnection(
...@@ -66,10 +67,10 @@ namespace ZPDatabase{ ...@@ -66,10 +67,10 @@ namespace ZPDatabase{
protected: protected:
bool bTerm; bool bTerm;
QMutex m_mutex_reg; QMutex m_mutex_reg;
QMap <QString,tagConnectionPara> m_dbNames; QMap <QString,tagConnectionPara> m_dbNames; //Each Main connection Name, and their connection para
QMap <QString, QSet<QString> > m_ThreadsDB; QMap <QString, QSet<QString> > m_ThreadsDB; //Each Main connection Name, and theri thread-owned names
QMap <QThread * , QSet<QString> > m_ThreadOwnedMainDBs; QMap <QThread * , QMap<QString,QDateTime> > m_ThreadOwnedMainDBs; //Each Thread owns Main connection Names.
void RemoveTreadsConnections(QString mainName); void RemoveTreadsConnections(QString mainName);
signals: signals:
void evt_Message(QObject *,QString ); void evt_Message(QObject *,QString );
public slots: public slots:
......
...@@ -160,7 +160,7 @@ namespace ZPNetwork{ ...@@ -160,7 +160,7 @@ namespace ZPNetwork{
//emit evt_Message(this,"Info>" + QString(tr("Incomming client arriverd."))); //emit evt_Message(this,"Info>" + QString(tr("Incomming client arriverd.")));
qDebug()<<tr("Incomming client arriverd."); qDebug()<<tr("Incomming client arriverd.");
//m_mutex_trans.lock();
int nsz = m_vec_NetTransThreads.size(); int nsz = m_vec_NetTransThreads.size();
int nMinPay = 0x7fffffff; int nMinPay = 0x7fffffff;
int nMinIdx = -1; int nMinIdx = -1;
...@@ -192,7 +192,7 @@ namespace ZPNetwork{ ...@@ -192,7 +192,7 @@ namespace ZPNetwork{
emit evt_Message(this,"Warning>"+QString(tr("Need Trans Thread Object for clients."))); emit evt_Message(this,"Warning>"+QString(tr("Need Trans Thread Object for clients.")));
qCritical()<<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, * @brief This is a slot function. when a listening thread is terminated,
......
...@@ -245,7 +245,7 @@ namespace ZPNetwork{ ...@@ -245,7 +245,7 @@ namespace ZPNetwork{
{ {
QTcpSocket * pSock = qobject_cast<QTcpSocket*>(sender()); QTcpSocket * pSock = qobject_cast<QTcpSocket*>(sender());
emit evt_NewClientConnected(pSock); 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()<< qDebug()<<pSock->peerAddress().toString()<<
pSock->peerPort() <<tr("(%1)..connected.").arg((quint64)pSock); pSock->peerPort() <<tr("(%1)..connected.").arg((quint64)pSock);
} }
...@@ -410,7 +410,7 @@ namespace ZPNetwork{ ...@@ -410,7 +410,7 @@ namespace ZPNetwork{
return; return;
m_mutex_protect.lock(); m_mutex_protect.lock();
QList<QObject *> clientList = m_clientList.values(); QList<QObject *> clientList = m_clientList.values();
m_mutex_protect.unlock();
foreach(QObject * obj,clientList) foreach(QObject * obj,clientList)
{ {
QTcpSocket * pSock = qobject_cast<QTcpSocket*>(obj); QTcpSocket * pSock = qobject_cast<QTcpSocket*>(obj);
...@@ -438,7 +438,8 @@ namespace ZPNetwork{ ...@@ -438,7 +438,8 @@ namespace ZPNetwork{
} }
} }
m_mutex_protect.unlock(); //m_clientList.clear();
// m_mutex_protect.unlock();
} }
void zp_netTransThread::KickClient(QObject * objClient) void zp_netTransThread::KickClient(QObject * objClient)
......
...@@ -102,6 +102,7 @@ namespace ExampleServer{ ...@@ -102,6 +102,7 @@ namespace ExampleServer{
{ {
//strcpy(reply.TextInfo,"Server Access Error."); //strcpy(reply.TextInfo,"Server Access Error.");
emit evt_Message(this,tr("Database Access Error :")+query.lastError().text()); emit evt_Message(this,tr("Database Access Error :")+query.lastError().text());
db.close();
} }
} }
else else
......
...@@ -25,6 +25,7 @@ namespace ExampleServer{ ...@@ -25,6 +25,7 @@ namespace ExampleServer{
if (false== query.exec()) if (false== query.exec())
{ {
emit evt_Message(this,tr("try to get relations Failed! ")+ query.lastError().text()); emit evt_Message(this,tr("try to get relations Failed! ")+ query.lastError().text());
db.close();
return false; return false;
} }
...@@ -57,6 +58,7 @@ namespace ExampleServer{ ...@@ -57,6 +58,7 @@ namespace ExampleServer{
if (false== query.exec()) if (false== query.exec())
{ {
emit evt_Message(this,tr("try to del old relations Failed! ")+ query.lastError().text()); emit evt_Message(this,tr("try to del old relations Failed! ")+ query.lastError().text());
db.close();
return false; return false;
} }
...@@ -77,6 +79,7 @@ namespace ExampleServer{ ...@@ -77,6 +79,7 @@ namespace ExampleServer{
if (false== query.exec()) if (false== query.exec())
{ {
emit evt_Message(this,tr("try to insert new relations Failed! ")+ query.lastError().text()); emit evt_Message(this,tr("try to insert new relations Failed! ")+ query.lastError().text());
db.close();
return false; return false;
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册