//最近数据库存储做了重大改变,数据库内部的回头再说,先看看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())//判断数据库是否忙,忙就是看起请求包是否大于100 return; 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();//关闭定时器 }