Core/DBLayer:

- Rewrite KeepAlive method for DatabaseWorkerPool. Use mysql_ping instead of explicit select queries, and also schedule KeepAlives for asynchronous threads.
NOTE: While the function is implemented and previous keepalive calls were transformed, it´s possible the keepalive call will need to be placed in several other locations in the code. Please leave feedback on whether or not this fixes your timeout issues.

Update issue #4062

--HG--
branch : trunk
This commit is contained in:
Machiavelli
2010-09-25 01:05:24 +02:00
parent 154d11acc0
commit 62946f9ef6
4 changed files with 34 additions and 2 deletions

View File

@@ -314,7 +314,7 @@ extern int main(int argc, char **argv)
{
loopCounter = 0;
sLog.outDetail("Ping MySQL to keep connection alive");
LoginDatabase.Query("SELECT 1 FROM realmlist");
LoginDatabase.KeepAlive();
}
#ifdef _WIN32
if (m_ServiceStatus == 0) stopEvent = true;

View File

@@ -43,6 +43,16 @@ enum MySQLThreadBundle
MYSQL_BUNDLE_ALL = MYSQL_BUNDLE_RA | MYSQL_BUNDLE_RAR | MYSQL_BUNDLE_WORLD,
};
class PingOperation : public SQLOperation
{
/// Operation for idle delaythreads
bool Execute()
{
m_conn->Ping();
return true;
}
};
template <class T>
class DatabaseWorkerPool
{
@@ -304,6 +314,27 @@ class DatabaseWorkerPool
return PreparedQueryResult(ret);
}
void KeepAlive()
{
ConnectionMap::const_iterator itr;
{
/*! MapUpdate + unbundled threads */
ACE_Guard<ACE_Thread_Mutex> guard(m_connectionMap_mtx);
itr = m_sync_connections.find(ACE_Based::Thread::current());
if (itr != m_sync_connections.end())
itr->second->Ping();
}
if (m_bundle_conn)
m_bundle_conn->Ping();
/// Assuming all worker threads are free, every worker thread will receive 1 ping operation request
/// If one or more worker threads are busy, the ping operations will not be split evenly, but this doesn't matter
/// as the sole purpose is to prevent connections from idling.
for (size_t i = 0; i < m_async_connections.size(); ++i)
Enqueue(new PingOperation);
}
private:
unsigned long escape_string(char *to, const char *from, unsigned long length)
{

View File

@@ -50,6 +50,7 @@ class MySQLConnection
void CommitTransaction();
operator bool () const { return m_Mysql != NULL; }
void Ping() { mysql_ping(m_Mysql); }
protected:
MYSQL* GetHandle() { return m_Mysql; }

View File

@@ -135,7 +135,7 @@ public:
{
loopCounter = 0;
sLog.outDetail ("Ping MySQL to keep connection alive");
LoginDatabase.Query ("SELECT 1 FROM realmlist LIMIT 1");
LoginDatabase.KeepAlive();
}
}