| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- #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();
- }
|