[11045] Rewrite internals of DB layer. Simplify code and use less locking. Spawn and use separate connections for sync and async DB requests. Implement database connection pool for SELECT queries. Up to maximum 16 connections supported. Disable 'autocommit' mode for MySQL.

UPDATE YOUR CONFIGS!

Defaults:
LoginDatabaseConnections = 1
WorldDatabaseConnections = 1
CharacterDatabaseConnections = 1

If you are not using <mtmaps> patch do not change the default settings - this is useless. You can try following option in your MySQL config to squeeze even more performance from your DB:

[mysqld]
transaction-isolation = READ-COMMITTED

Great thanks to Undergarun, kero99 and selector for making tests and providing very useful feedback and DB statistics! Have fun :)

Signed-off-by: Ambal <pogrebniak@gala.net>
This commit is contained in:
Ambal 2011-01-19 22:04:54 +02:00
parent 9bc37afa28
commit 631ce36680
19 changed files with 655 additions and 547 deletions

View file

@ -29,13 +29,14 @@
/// ---- BASE ---
class Database;
class SqlConnection;
class SqlDelayThread;
class SqlOperation
{
public:
virtual void OnRemove() { delete this; }
virtual void Execute(Database *db) = 0;
virtual void Execute(SqlConnection *conn) = 0;
virtual ~SqlOperation() {}
};
@ -48,26 +49,25 @@ class SqlStatement : public SqlOperation
public:
SqlStatement(const char *sql) : m_sql(mangos_strdup(sql)){}
~SqlStatement() { char* tofree = const_cast<char*>(m_sql); delete [] tofree; }
void Execute(Database *db);
void Execute(SqlConnection *conn);
};
class SqlTransaction : public SqlOperation
{
private:
std::queue<const char *> m_queue;
ACE_Thread_Mutex m_Mutex;
std::vector<const char *> m_queue;
public:
SqlTransaction() {}
~SqlTransaction();
void DelayExecute(const char *sql)
{
char* _sql = mangos_strdup(sql);
if (_sql)
{
ACE_Guard<ACE_Thread_Mutex> _lock(m_Mutex);
m_queue.push(_sql);
}
m_queue.push_back(_sql);
}
void Execute(Database *db);
void Execute(SqlConnection *conn);
};
/// ---- ASYNC QUERIES ----
@ -95,7 +95,7 @@ class SqlQuery : public SqlOperation
SqlQuery(const char *sql, MaNGOS::IQueryCallback * callback, SqlResultQueue * queue)
: m_sql(mangos_strdup(sql)), m_callback(callback), m_queue(queue) {}
~SqlQuery() { char* tofree = const_cast<char*>(m_sql); delete [] tofree; }
void Execute(Database *db);
void Execute(SqlConnection *conn);
};
class SqlQueryHolder
@ -124,6 +124,6 @@ class SqlQueryHolderEx : public SqlOperation
public:
SqlQueryHolderEx(SqlQueryHolder *holder, MaNGOS::IQueryCallback * callback, SqlResultQueue * queue)
: m_holder(holder), m_callback(callback), m_queue(queue) {}
void Execute(Database *db);
void Execute(SqlConnection *conn);
};
#endif //__SQLOPERATIONS_H