//最近数据库存储做了重大改变,数据库内部的回头再说,先看看GS这边的
1.现在感觉数据库的状态将请求包放入命令队列中,以前是全部放进去,这样让其他的数据库操作不会随着数据库定时器而变慢,GS线程去驱动,一分钟不太可能还存不完
2.差异更新,GS只获取更改了的记录,这样不用每次都把全部的记录都放进去,这个过程是数据库改观不少
外面搞个mgr,内部使用可以重用的模板类,感觉是比之前封装的要好,但复杂度也上去了
m_spSaveOptMgr.reset(new SaveOptMgr(m_spAsynDBC.get(), m_spPropManager.get(), m_spGuildOpt.get()));m_spSaveOptMgr->Init();
//reset:重置管理的指针
//new():根绝传递的参数调用不同的构造函数
//get():返回原始的指针
SaveOptMgr::SaveOptMgr(I_asynDBCenter* pAsyDB,I_PropManager* pPropMgr,I_GuildOpt* pGuildOpt) : m_pAsyDBCenter(pAsyDB),m_pPropManager(pPropMgr),m_pGuildOpt(pGuildOpt),m_nStartRef(2)
{//m_cSaveProp是由模板实例化出来的类,m_cSaveProp.m_fnGetSaveObjs        = std::bind(&SaveOptMgr::GetSaveProps,    this,ph::_1);//成员绑定外层的函数,是可以的,感觉啊只要是本进程的都可以绑定,对于成员函数的内存空间不是太懂啊m_cSaveGuild.m_fnGetSaveObjs    = std::bind(&SaveOptMgr::GetSaveGuilds, this,ph::_1);m_cSaveProp.m_fnSaveObjs        = std::bind(&SaveOptMgr::SaveProps,        this,ph::_1, ph::_2, ph::_3);m_cSaveGuild.m_fnSaveObjs        = std::bind(&SaveOptMgr::SaveGuilds,    this,ph::_1, ph::_2, ph::_3);
}//初始化
void SaveOptMgr::Init()
{m_spTimer.reset(GetPlug(TimerFactory)->createTimer());m_spTimer->regTimer(std::bind(&SaveOptMgr::operator(), this));//重写了类的()操作符m_spTimer->setInterval(60 * 1000);
}
//定时获取
void SaveOptMgr::operator()()
{TimedSaveAll();//这个主要是定时器时间到了把要存储的全部放到数据库的请求队列中m_cSaveGuild.LoadSaveObjs();//经过这两个操作,相应要保存的数据都m_vecSaveObj中
    m_cSaveProp.LoadSaveObjs();
}template<typename SaveObjType>
void SaveOptMgr::SaveOpt<SaveObjType>::TimeSaveAll()
{int nAllSize = m_vecSaveObj.size();if (m_nSaveFlag >= 0 && m_nSaveFlag < nAllSize){m_fnSaveObjs(m_vecSaveObj, m_nSaveFlag, m_vecSaveObj.size());//m_fnSaveObjs绑定的是mgr里面的函数
    }
}
//其实就是通过那个function去调用Mgr里面的函数,这样只有mgr这层去跟别的模块打交道
void SaveOptMgr::SaveProps(const std::vector<PropModifyItem>& vecSaveObjs,int nBeginIndex,int nEndIndex)
{m_pAsyDBCenter->SetPropInfos(vecSaveObjs, nBeginIndex, nEndIndex);
}template<typename SaveObjType>
void SaveOptMgr::SaveOpt<SaveObjType>::LoadSaveObjs()
{        m_fnGetSaveObjs(m_vecSaveObj);//通过function去调用mgr里面的函数到相应的管理器里面获取数据,但真正的数据还是存在m_vecSaveObj里面if (m_vecSaveObj.empty())return;SetCanSave();    //设置一个标记
}void SaveOptMgr::Driver()
{if (IsBusyOfDB())//判断数据库是否忙,忙就是看起请求包是否大于100return;m_cSaveGuild.Save();m_cSaveProp.Save();
}
//定时保存
template<typename SaveObjType>
void SaveOptMgr::SaveOpt<SaveObjType>::Save()
{if (!CanSave())//看是否能存储return;int nSaveSize = m_vecSaveObj.size();if (m_nSaveFlag < nSaveSize){int nEndIndex = m_nSaveFlag + eMaxSaveCount;if (nEndIndex > nSaveSize)nEndIndex = nSaveSize;m_fnSaveObjs(m_vecSaveObj, m_nSaveFlag, nEndIndex);m_nSaveFlag = nEndIndex;}else{SetNoneSave();//存储完了就设置成没有存储的
    }
}//GS关闭强制保存所有未保存的道具,帮会
void SaveOptMgr::Stop()
{operator()();//从相应的管理器里面获取未保存的m_cSaveProp.ForceSaveAll();//强制放到请求队列中
    m_cSaveGuild.ForceSaveAll();m_spTimer->stop();//关闭定时器
}

转载于:https://www.cnblogs.com/zzyoucan/p/4136317.html

GS(道具,帮会)定时存储相关推荐

  1. 【v3.6.2】iNeuOS工业互联网操作系统,发布实时存储方式:实时存储、变化存储、定时存储,设备振动状态和电能状态监测驱动...

    目       录 1.      概述... 1 2.      平台演示... 2 3.      存储方式... 2 4.      设备状态和用电状态监控驱动... 3 1.   概述 本次升 ...

  2. Infortrend新一代GS统一存储系统性能全面提升

    Infortrend推出两款全新一代的存储解决方案:统一存储EonStor GS Gen2和全闪存EonStor GSa Gen2,NAS性能提高60%以上.性能上的提高,让新的存储系统能够适应更为严 ...

  3. Qt编写安防视频监控系统46-视频存储

    一.前言 在整个视频监控系统的开发迭代升级过程中,遇到过各种奇奇怪怪的需求,都是客户提出来的,有些需求很合理,有些就不那么的自然了,牢记这客户是上帝的原则,能满足的尽量满足.相信各位同行的研发人员都会 ...

  4. Qt编写安防视频监控系统13-视频存储

    一.前言 一般视频监控行业都会选择把视频存储在本地NVR或者服务器上,而不是存储在客户端电脑,只有当用户经费预算有限的时候,或者用户特殊需求要求存储在本地客户端电脑的时候才会开启存储到本地,正常来说视 ...

  5. 基于InChat的SpringBoot版本通讯聊天数据存储Demo,附带详细流程说明

    阅读本文约"10分钟" 适读人群:java初级 前言 InChat = Iot Netty Chat 首先,感谢那些一直以来支持InChat的朋友们,你们可能是因为工作原因,或者自 ...

  6. 五星好评!Infortrend统一存储获得权威杂志大力推荐

    日前业界Infortrend普安科技的统一存储EonStor GS 3000 Gen2获得英国权威杂志<IT Pro>五星级好评.IT Pro对GS 3000 Gen2给出了"性 ...

  7. linux监听9080,基于UPnP发现与组播技术的IPTV终端实现

    摘 要:本文设计并实现的终端系统工作在mClinux操作系统下,通过应用UPnP中的SSDP服务发现协议,实现在局域网中IPTV终端的自动发现, 并使用IP组播技术将TV视频信号及本地的AV视频信号. ...

  8. 安卓帧数监测软件_土壤墒情监测仪

    土壤墒情监测仪(HM-TS600) 1.技术参数 ★主控制器技术参数 ·数据存储空间:≥100000条 ·记录间隔:1分-24小时可调 ·数据传输:无线传输 ·工作环境:-30℃-80℃ ·供电方式: ...

  9. 我是如何在SQLServer中处理每天四亿三千万记录的

    原文地址:http://www.cnblogs.com/marvin/p/HowCanIHandleBigDataBySQLServer.html 首先声明,我只是个程序员,不是专业的DBA,以下这篇 ...

  10. 服务器智能监控软件,监控 监控系统 消防智能监控 智能监控软件

    城市消防网络智能监控系统方案 一.系统拓扑图: 城市消防网络监控系统采用分层分布构架,管理级采用集中管控,运行监控服务器,通过专用网络或公用网络组网.每个监控终端配置一台工控机,作为现地管理单元,消防 ...

最新文章

  1. 重构:一项常常被忽略的基本功
  2. cpu和显卡瓶颈测试软件,《怪物猎人:世界》CPU测试:4核成瓶颈、6核才够用
  3. 算法练习day8——190326(猫狗队列、转圈打印矩阵、旋转正方形矩阵、反转单向双向链表、数N的加法组合)
  4. json 对象 数组
  5. 修复./mysql/proc
  6. Nginx+Tpmcat 负载均衡
  7. 2017.10.9 找相同字符 失败总结
  8. codekit for mac(开发人员必备编译工具)
  9. 7-60 致命的珠宝 (10分)
  10. 高等数学 —— 二元函数极值存在定理与拉格朗日乘数法求最值
  11. 自己建设网站需要学习什么?
  12. HTML表单练习~百度注册
  13. 王者荣耀微信哪个服务器怎么选,王者荣耀:国服战力对比!手Q和微信哪个大区的战力更胜一筹?...
  14. vue element 单张图片上传,删除,预览
  15. 用Python爬取购物节当天热门商品销量数据,看看大家喜欢什么
  16. 图像描述的注意力可视化
  17. 电感RDC、IDC值是什么意思?或DCR DCI
  18. 重磅开讲 | 图灵奖得主—— Joseph Sifakis
  19. html语言div图片垂直居中,图文详解图片水平垂直居中的五种方法
  20. markdown 常用基本操作及示例代码

热门文章

  1. IT程序猿常用编辑工具:UltraEdit for Mac v21.00.0.12中文版
  2. 小白教程:如何在MAC菜单栏上显示日期和时间
  3. 如何在Mac上设置语音整点报时
  4. keepalived 非抢占模式
  5. (十六)java版b2b2c社交电商spring cloud分布式微服务-用restTemplate消费服务
  6. SVN服务设置提交时备注文字长度
  7. laravel路由基本知识
  8. Expressbody-parser
  9. PowerPivot 和 SQL Azure 快速入门
  10. Eclipse开发环境下,部署和配置svn的整个过程