Files
mir_server/server/DBServer/DBDataClientHandler.h
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

162 lines
4.9 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef DB_DATA_CLIENT_HANDLER_H__
#define DB_DATA_CLIENT_HANDLER_H__
/*
DBClient逻辑处理类。处理来自客户端(主要是逻辑服)的DB请求这里之关系逻辑处理不关心数据接收相关的处理。
原来的DBClient将通信线程和DB请求逻辑处理和在一起在逻辑服DB操作比较频繁、DB查询压力大查询和更新DB
比较缓慢的情况下会导致堆积的未处理请求越来越多延迟很慢并且由于DBClient数据处理不过来导致逻辑服那边堆
积的 DB请求数据包也越来越多造成逻辑服内存消耗巨大。
为解决上述问题将DBClient的数据接收和处理逻辑分开。接收数据线程只关心数据接收不处理逻辑这样不会造
成堆积数据包;同时逻辑处理区分优先级,不是一次性处理完所有大量玩家的存盘数据,分时处理,并且设定优先级策略,
查询数据的优先级高于更新数据的优先级。
*/
class CDBDataClientHandler :
public wylib::thread::CBaseThread,
public CSendPacketPool
{
public:
friend class CDBDataCache;
// ctor and dtor
CDBDataClientHandler();
~CDBDataClientHandler();
/*
* Comments: 开始运行。
* @Param ILogicDBRequestHost* pHost:
* @Param CSQLConenction *lpSQLConnection:
* @Return bool: 成功返回true失败返回false
* @Remark: 开启后台线程并且等待后台线程开始运行。
*/
bool Start(ILogicDBRequestHost* pHost, CSQLConenction *lpSQLConnection);
/*
* Comments:
* @Return bool:
* @Remark:
*/
bool Stop();
/*
* Comments: 添加一个DB请求的消息
* Param jxSrvDef::INTERSRVCMD nCmd: 消息Id
* Param CDataPacketReader & packet: 消息数据
* @Return void:
* @Remark: 将DB请求数据添加到队列中。这里不处理数据。供通信线程调用
*/
void AddMessage(jxSrvDef::INTERSRVCMD nCmd, CDataPacketReader& packet);
CLogicDBReqestHandler& GetDBRequestHandler() { return m_LogicDBReqHandler; }
//追踪内存使用情况
void Trace();
protected:
/*
* Comments: 设置读操作标记
* Param BOOL flag:
* @Return void:
* @Remark: 如果当前有读操作未完成flag设置为true否则设置为false
*/
inline void SetReadOpFlag(BOOL flag)
{
InterlockedExchange(&m_bHasReadOp, flag);
}
/*
* Comments: 获取读操作标记
* @Return bool: 如果当前存在读操作返回true否则返回false
* @Remark:
*/
BOOL HasReadOPFlag() const { return m_bHasReadOp; }
/*
* Comments: 判断当前是否是读操作
* Param jxSrvDef::INTERSRVCMD nCmd:
* @Return bool:
* @Remark:
*/
bool IsReadCmd(jxSrvDef::INTERSRVCMD nCmd);
/*
* Comments: 线程处理函数
* @Return void:
* @Remark:
*/
virtual void OnRountine();
/*
* Comments: 线程逻辑处理函数
* @Return void:
* @Remark:
*/
void ThreadLogicProc();
/*
* Comments: DB请求逻辑处理
* @Return void:
* @Remark: 遍历DB请求列表并且处理。对于玩家存盘请求直接加入到ActorCache数据里头对于查询数据直接执行SQL查询
*/
void RunOne();
/*
* Comments: 分配数据包
* @Return void:
* @Remark:
*/
CDataPacket* AllocPacket();
/*
* Comments: 释放用完的数据包
* Param CDataPacket * packet:
* @Return void:
* @Remark:
*/
void FreePacket(CDataPacket* packet);
/*
* Comments: 销毁数据包列表
* Param CQueueList<CDataPacket * > & pkgList:
* @Return void:
* @Remark: 删除对象
*/
void DestroyPacketList(CQueueList<CDataPacket*>& pkgList);
/*
* Comments: 处理DB请求消息
* Param jxSrvDef::INTERSRVCMD nCmd: 消息码
* Param CDataPacket & packet: 消息参数
* @Return void:
* @Remark:
*/
void HandleDBMessage(jxSrvDef::INTERSRVCMD nCmd, CDataPacket &packet);
private:
CQueueList<CDataPacket*> m_sMsgList; // DB请求消息列表格式消息ID+消息参数)。
CCSLock m_sMsgListLock;
CQueueList<CDataPacket*> m_sFreeList; // 自由消息数据包
CCSLock m_sFreeListLock;
//CBufferAllocator m_allocator; // BuffAllocator用于DataPacket的内存分配
CDBDataCache m_sActorCacheData; // 角色DB存盘Cache数据
volatile long m_bHasReadOp; // 当前是否有读DB操作
volatile long m_lStop; // 线程停止标记
volatile long m_lHasStart; //是否已经启动
volatile long m_lLogicIsRunning; //逻辑线程是否已经启动
ILogicDBRequestHost* m_pHost; //
CCSLock m_sStartLock; // 线程开始启动锁
#ifdef WIN32
HANDLE m_hStartEvent; //启动信号事件
HANDLE m_hStopEvent; //停止信号事件
#else
sem_t m_hStartEvent; //启动信号事件
sem_t m_hStopEvent; //停止信号事件
#endif
CLogicDBReqestHandler m_LogicDBReqHandler; // DB请求处理
static int s_nDBHandleSleep; // DB逻辑处理睡眠时间
TICKCOUNT m_memoryTimer; //定时器
};
#endif // _DB_DATA_CLIENT_HANDLER_H__