diff options
| author | Machiavelli <none@none> | 2010-09-25 01:05:24 +0200 |
|---|---|---|
| committer | Machiavelli <none@none> | 2010-09-25 01:05:24 +0200 |
| commit | 62946f9ef643e33adbb0b4fe1d5139a1cb37dae1 (patch) | |
| tree | 2bd1bc4cd742d42f188dcc1164525244225f47fa /src/server/shared/Database | |
| parent | 154d11acc0afdf3639e6a07c931e35674102e44a (diff) | |
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
Diffstat (limited to 'src/server/shared/Database')
| -rw-r--r-- | src/server/shared/Database/DatabaseWorkerPool.h | 31 | ||||
| -rw-r--r-- | src/server/shared/Database/MySQLConnection.h | 1 |
2 files changed, 32 insertions, 0 deletions
diff --git a/src/server/shared/Database/DatabaseWorkerPool.h b/src/server/shared/Database/DatabaseWorkerPool.h index 6092381f86f..2c6afa2e9e2 100644 --- a/src/server/shared/Database/DatabaseWorkerPool.h +++ b/src/server/shared/Database/DatabaseWorkerPool.h @@ -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) { diff --git a/src/server/shared/Database/MySQLConnection.h b/src/server/shared/Database/MySQLConnection.h index 09c30e7073e..93812421c8a 100644 --- a/src/server/shared/Database/MySQLConnection.h +++ b/src/server/shared/Database/MySQLConnection.h @@ -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; } |
