#include "StdAfx.h" #include "SqlWriter.h" SINGLETON_IMPLEMENT(CSqlWriter) CSqlWriter::CSqlWriter(void) { m_WinThread = AfxBeginThread(__writeThreadFun, this); } CSqlWriter::~CSqlWriter(void) { TerminateThread(m_WinThread->m_hThread, 0); } /***************************************************************** **【函数名称】 __popSql **【函数功能】 取出Sql语句 **【参数】 Sql: 输出参数,Sql语句 **【返回值】 成功true,失败false ****************************************************************/ bool CSqlWriter::__popSql( CString& Sql ) { CSingleLock Locker(&m_LockSection, TRUE); if(m_SQLList.GetCount() > 0) { // 缓冲区中取SQL语句 Sql = m_SQLList.RemoveHead(); return true; } else return false; } /***************************************************************** **【函数名称】 __writeThreadFun **【函数功能】 呼叫明细记录线程函数 **【参数】 **【返回值】 ****************************************************************/ UINT CSqlWriter::__writeThreadFun( LPVOID pParam ) { CSqlWriter* pSelf = (CSqlWriter*)pParam; ASSERT(pSelf != NULL); CString Sql; IOtlConnection* pDbControl = IOtlConnection::getInstance(); ASSERT(pDbControl != NULL); if(pDbControl == NULL) { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{SQL}: 记录统计信息时获取数据库接口失败")); return 0; } while(TRUE) { while(pSelf->__popSql(Sql)) { // 数据库执行 if(!pDbControl->ExecCommand(Sql)) { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{SQL}: 统计信息写入数据库失败,统计内容:%s"), Sql); ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{SQL}: 统计写入数据库失败原因:%s"), pDbControl->GetLastError()); } } // end while Sleep(100); } // end while return 0; } /***************************************************************** **【函数名称】 addSql **【函数功能】 添加Sql语句到缓冲区队列 **【参数】 Sql:Sql语句 **【返回值】 ****************************************************************/ void CSqlWriter::addSql( CString& Sql ) { m_LockSection.Lock(); // 保证缓冲区字节大小不超过10M if(m_SQLList.GetCount() < 1024) m_SQLList.AddTail(Sql); else ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{SQL}: 插入统计数据时由于缓存量过大,将遗弃该条数据:%s"), Sql); m_LockSection.Unlock(); }