游戏服务器之基于文件数据库和mysql数据库的db服务器设计

设计上:

(1)文件数据库是用于处理游戏逻辑业务请求。

(2)mysql数据库是用于处理运营后台查询请求。

(3)备份业务是用于定时备份文件数据库文件。


总体设计图如 http://blog.csdn.net/chenjiayi_yun/article/details/11913207

文件数据库业务设计 可查看 http://blog.csdn.net/chenjiayi_yun/article/details/17880275



本文目录:

1、角色数据更新请求

2、mysql业务线程循环处理更新请求

3、文件数据库业务线程循环处理更新请求

4、备份业务线程循环处理备份业务


本文内容:

1、角色数据更新请求

保存角色数据请求,提交到业务线程队列

保存角色描述数据,提交到文件数据库角色描述数据更新列表和mysql角色描述数据更新列表。

保存角色具体数据,提交到文件数据库角色数据更新列表和mysql角色数据更新列表。

  1. VOID CDBDataClient::CatchSaveCharData(CDataPacketReader &inPacket)  
  2. {  
  3. INT64 nCharId;  
  4. DWORD dwDataSize;  
  5.   
  6. inPacket >> nCharId;  
  7. inPacket >> dwDataSize;  
  8.   
  9. CGameDataBuffer *pBuffer = m_pDataServer->AllocGameDataBuffer();  
  10. pBuffer->AddRef();  
  11. pBuffer->SetData(nCharId, inPacket.getOffsetPtr(), dwDataSize);  
  12.   
  13. CharDesc *pCharDesc = m_pLocalDB->GetCharDesc(nCharId);  
  14. if (pCharDesc)  
  15. {  
  16. //跳过角色基本数据头结构  
  17. common::DBType::PlayerBasicData *pBaseData =(common::DBType::PlayerBasicData *)\  
  18. pBuffer->getPositionPtr(sizeof(common::DBType::DataSectionHeader));  
  19.   
  20. //发起对角色描述数据的更新  
  21. pCharDesc->wLevel = pBaseData->wLevel;  
  22. pCharDesc->btGender = pBaseData->btGender;  
  23. pCharDesc->nUpdateTime = CMiniDateTime::now();  
  24.   
  25. m_pLocalDB->PostUpdateCharDesc(pCharDesc);  
  26. m_pSQLDB->PostUpdateCharDesc(pCharDesc);  
  27. }  
  28. else logError( _T("试图更新在本地角色描述数据中找不到的角色数据(%lld)"), nCharId);  
  29.   
  30. m_pLocalDB->PostUpdateCharData(pBuffer);  
  31. m_pSQLDB->PostUpdateCharData(pBuffer);  
  32.   
  33. pBuffer->Release();  
  34.   
  35. CDataPacket &pack = AllocProtoPacket(DBType::dsSaveCharData);  
  36. pack << (int)0;//SUCCESS  
  37. pack << nCharId;  
  38. FlushProtoPacket(pack);  
  39. }  



2、mysql业务线程循环处理更新请求

mysql线程处理循环,处理数据写入mysql请求

  1. VOID CSQLDB::OnRountine()  
  2. {  
  3. TICKCOUNT dwStartTick;  
  4. while (!terminated())  
  5. {  
  6. if (!m_boStarted)  
  7. {  
  8. moon::OS::osSleep(16);  
  9. continue;  
  10. }  
  11. //连接SQL数据库  
  12. if (!ConnectSQLDB())  
  13. {  
  14. moon::OS::osSleep(16);  
  15. continue;  
  16. }  
  17. dwStartTick = _getTickCount();  
  18. //处理角色描述更新请求  
  19. m_NewCharList.flush();  
  20. if (m_NewCharList.count() > 0)  
  21. {  
  22. ProcessAddNewChars(4);  
  23. }  
  24. m_UpdateCharDescList.flush();  
  25. if (m_UpdateCharDescList.count() > 0)  
  26. {  
  27. ProcessUpdateCharDescs(4);  
  28. }  
  29. //处理角色数据更新请求  
  30. m_CharDataUpdateList.flush();  
  31. if (m_CharDataUpdateList.count() > 0)  
  32. {  
  33. ProcessCharDataUpdate(4);  
  34. }  
  35. //处理帮会数据更新请求  
  36. m_GuildDataUpdateList.flush();  
  37. if (m_GuildDataUpdateList.count() > 0)  
  38. {  
  39. ProcessGuildDataUpdate(4);  
  40. }  
  41. moon::OS::osSleep(4);  
  42. }  
  43. }  



3、文件数据库业务线程循环处理更新请求

  1. VOID CLocalDB::OnRountine()  
  2. {  
  3.     TICKCOUNT dwStartTick;  
  4.     TICKCOUNT dwBackupTick = 0;  
  5.     while (!terminated())  
  6.     {  
  7.         if (!m_boOpened)  
  8.         {  
  9.             osSleep(16);  
  10.             continue;  
  11.         }  
  12.   
  13.         dwStartTick = _getTickCount();  
  14.         if ((m_nBackupInterval) && (0 == dwBackupTick))  
  15.             dwBackupTick = _getTickCount();  
  16.         //处理角色描述更新请求  
  17.         m_CharDescUpdateList.flush();  
  18.         if (m_CharDescUpdateList.count() > 0)  
  19.         {  
  20.             ProcessCharDescUpdate(4);  
  21.         }  
  22.         //处理角色数据更新请求  
  23.         m_CharDataUpdateList.flush();  
  24.         if (m_CharDataUpdateList.count() > 0)  
  25.         {  
  26.             ProcessCharDataUpdate(4);  
  27.         }  
  28.         //处理帮会数据更新请求  
  29.         m_GuildDataUpdateList.flush();  
  30.         if (m_GuildDataUpdateList.count() > 0)  
  31.         {  
  32.             ProcessGuildDataUpdate(4);  
  33.         }  
  34.   
  35.         if ((m_nBackupInterval) && ((INT)(_getTickCount() - dwBackupTick) >= m_nBackupInterval))//每隔一段时间(目前48小时)  
  36.         {  
  37.             BackupFDBFiles();  
  38.             m_ZipBackup.StartZipBackup();//发送信号通知备份业务线程处理备份业务  
  39.             dwBackupTick = 0;  
  40.         }  
  41.   
  42.         osSleep(4);  
  43.     }  
  44. }  

4、备份业务线程循环处理备份业务

备份业务线程阻塞等待通知来处理文件数据库的文件的备份业务。

  1. VOID CZipBackup::OnRountine()  
  2. {  
  3. #ifdef WINDOWS  
  4.     m_hZipBackupEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);  
  5. #else  
  6.     pthread_cond_init(&m_hZipBackupEvent, NULL);  
  7. #endif  
  8.     while (!terminated())  
  9.     {  
  10. #ifdef WINDOWS  
  11.         ::WaitForSingleObject(m_hZipBackupEvent, INFINITE);  
  12. #else  
  13.         pthread_mutex_lock( &m_tx );  
  14.         pthread_cond_wait( &m_hZipBackupEvent , &m_tx );  
  15.         pthread_mutex_unlock( &m_tx );  
  16. #endif  
  17.         if (terminated())  
  18.             break;  
  19.         DoZipBackup();  
  20.         CleanBackupFiles();  
  21.         osSleep(10);  
  22.     }  
  23. #ifdef WINDOWS  
  24.     ::CloseHandle(m_hZipBackupEvent);  
  25.     m_hZipBackupEvent = NULL;  
  26. #else  
  27.     pthread_cond_destroy(&m_hZipBackupEvent);  
  28. #endif  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值