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();
|
||||
#endif
|
||||
|
||||
// Lets wait for next async task no more than 2 secs
|
||||
ACE_Time_Value _time(2);
|
||||
while (m_running)
|
||||
{
|
||||
// if the running state gets turned off while sleeping
|
||||
// empty the queue before exiting
|
||||
ACE_Based::Thread::Sleep(10);
|
||||
SqlOperation* s;
|
||||
while (m_sqlQueue.next(s))
|
||||
SqlAsyncTask * s = (SqlAsyncTask*)m_sqlQueue.dequeue(/*&_time*/);
|
||||
if(s)
|
||||
{
|
||||
s->Execute(m_dbEngine);
|
||||
s->call();
|
||||
delete s;
|
||||
}
|
||||
}
|
||||
@@ -53,5 +54,11 @@ void SqlDelayThread::run()
|
||||
void SqlDelayThread::Stop()
|
||||
{
|
||||
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
|
||||
|
||||
#include "ace/Thread_Mutex.h"
|
||||
#include "LockedQueue.h"
|
||||
#include "ace/Activation_Queue.h"
|
||||
#include "Threading.h"
|
||||
|
||||
class Database;
|
||||
@@ -30,7 +30,7 @@ class SqlOperation;
|
||||
|
||||
class SqlDelayThread : public ACE_Based::Runnable
|
||||
{
|
||||
typedef ACE_Based::LockedQueue<SqlOperation*, ACE_Thread_Mutex> SqlQueue;
|
||||
typedef ACE_Activation_Queue SqlQueue;
|
||||
|
||||
private:
|
||||
SqlQueue m_sqlQueue; ///< Queue of SQL statements
|
||||
@@ -42,7 +42,7 @@ class SqlDelayThread : public ACE_Based::Runnable
|
||||
SqlDelayThread(Database* db);
|
||||
|
||||
///< 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 run(); ///< Main Thread loop
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#include "Common.h"
|
||||
|
||||
#include "ace/Thread_Mutex.h"
|
||||
#include "ace/Method_Request.h"
|
||||
#include "LockedQueue.h"
|
||||
#include <queue>
|
||||
#include "Utilities/Callback.h"
|
||||
@@ -122,5 +123,33 @@ class SqlQueryHolderEx : public SqlOperation
|
||||
: m_holder(holder), m_callback(callback), m_queue(queue) {}
|
||||
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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user