| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- #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());
- bool isSuccess = false;
- for (int i = 0; i < 5; ++i)
- {
- Sleep(1000 * 2);
- if (pDbControl->ExecCommand(Sql))
- {
- isSuccess = true;
- ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{SQL}: 统计信息再次写入数据库成功,统计内容:%s"), Sql);
- break;
- }
- }
- if (!isSuccess) {
- 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();
- }
|