Implement async class for database operations for better performance, remove 10ms sleep, fixed some crash on sql execute.
--HG-- branch : trunk
This commit is contained in:
@@ -32,15 +32,16 @@ void SqlDelayThread::run()
|
|||||||
mysql_thread_init();
|
mysql_thread_init();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Lets wait for next async task no more than 2 secs
|
||||||
|
ACE_Time_Value _time(2);
|
||||||
while (m_running)
|
while (m_running)
|
||||||
{
|
{
|
||||||
// if the running state gets turned off while sleeping
|
// if the running state gets turned off while sleeping
|
||||||
// empty the queue before exiting
|
// empty the queue before exiting
|
||||||
ACE_Based::Thread::Sleep(10);
|
SqlAsyncTask * s = (SqlAsyncTask*)m_sqlQueue.dequeue(/*&_time*/);
|
||||||
SqlOperation* s;
|
if(s)
|
||||||
while (m_sqlQueue.next(s))
|
|
||||||
{
|
{
|
||||||
s->Execute(m_dbEngine);
|
s->call();
|
||||||
delete s;
|
delete s;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -53,5 +54,11 @@ void SqlDelayThread::run()
|
|||||||
void SqlDelayThread::Stop()
|
void SqlDelayThread::Stop()
|
||||||
{
|
{
|
||||||
m_running = false;
|
m_running = false;
|
||||||
|
m_sqlQueue.queue()->deactivate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SqlDelayThread::Delay(SqlOperation* sql)
|
||||||
|
{
|
||||||
|
int res = m_sqlQueue.enqueue(new SqlAsyncTask(m_dbEngine, sql));
|
||||||
|
return (res != -1);
|
||||||
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
#define __SQLDELAYTHREAD_H
|
#define __SQLDELAYTHREAD_H
|
||||||
|
|
||||||
#include "ace/Thread_Mutex.h"
|
#include "ace/Thread_Mutex.h"
|
||||||
#include "LockedQueue.h"
|
#include "ace/Activation_Queue.h"
|
||||||
#include "Threading.h"
|
#include "Threading.h"
|
||||||
|
|
||||||
class Database;
|
class Database;
|
||||||
@@ -30,7 +30,7 @@ class SqlOperation;
|
|||||||
|
|
||||||
class SqlDelayThread : public ACE_Based::Runnable
|
class SqlDelayThread : public ACE_Based::Runnable
|
||||||
{
|
{
|
||||||
typedef ACE_Based::LockedQueue<SqlOperation*, ACE_Thread_Mutex> SqlQueue;
|
typedef ACE_Activation_Queue SqlQueue;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SqlQueue m_sqlQueue; ///< Queue of SQL statements
|
SqlQueue m_sqlQueue; ///< Queue of SQL statements
|
||||||
@@ -42,7 +42,7 @@ class SqlDelayThread : public ACE_Based::Runnable
|
|||||||
SqlDelayThread(Database* db);
|
SqlDelayThread(Database* db);
|
||||||
|
|
||||||
///< Put sql statement to delay queue
|
///< Put sql statement to delay queue
|
||||||
bool Delay(SqlOperation* sql) { m_sqlQueue.add(sql); return true; }
|
bool Delay(SqlOperation* sql);
|
||||||
|
|
||||||
virtual void Stop(); ///< Stop event
|
virtual void Stop(); ///< Stop event
|
||||||
virtual void run(); ///< Main Thread loop
|
virtual void run(); ///< Main Thread loop
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
#include "Common.h"
|
#include "Common.h"
|
||||||
|
|
||||||
#include "ace/Thread_Mutex.h"
|
#include "ace/Thread_Mutex.h"
|
||||||
|
#include "ace/Method_Request.h"
|
||||||
#include "LockedQueue.h"
|
#include "LockedQueue.h"
|
||||||
#include <queue>
|
#include <queue>
|
||||||
#include "Utilities/Callback.h"
|
#include "Utilities/Callback.h"
|
||||||
@@ -122,5 +123,33 @@ class SqlQueryHolderEx : public SqlOperation
|
|||||||
: m_holder(holder), m_callback(callback), m_queue(queue) {}
|
: m_holder(holder), m_callback(callback), m_queue(queue) {}
|
||||||
void Execute(Database *db);
|
void Execute(Database *db);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class SqlAsyncTask : public ACE_Method_Request
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SqlAsyncTask(Database * db, SqlOperation * op) : m_db(db), m_op(op) {}
|
||||||
|
~SqlAsyncTask() { if(!m_op) return; delete m_op; }
|
||||||
|
|
||||||
|
int call()
|
||||||
|
{
|
||||||
|
if(m_db == NULL || m_op == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
m_op->Execute(m_db);
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
Database * m_db;
|
||||||
|
SqlOperation * m_op;
|
||||||
|
};
|
||||||
#endif //__SQLOPERATIONS_H
|
#endif //__SQLOPERATIONS_H
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user