数据库发包

现在就来看看数据库发包模式

这个用到了抽象工厂模式

其实经理的那个差不多都是注册具体工厂到抽象工厂,只是这里不是抽象工厂而是PktFactoryMgr功能和抽象工厂差不多

{
#define __REGISTER_DB_PKT_CREATEFUNCTION(DBOptClassType)    \
    Register<DBOptClassType>(PktSingleFactory<DBOptClassType>::GetOrCreateInstance());

    __REGISTER_DB_PKT_CREATEFUNCTION(AskActorList);//注册包工厂到m_vecPktConstructor中
    __REGISTER_DB_PKT_CREATEFUNCTION(AskActorInfo);
    __REGISTER_DB_PKT_CREATEFUNCTION(AskActorInfoEx);
    __REGISTER_DB_PKT_CREATEFUNCTION(AskUserInfo);
}
m_vecPktConstructor[pFactory->GetPktID()] =
            new FnPktCreate(std::bind(&PktSingleFactory<T>::CreatePkt, pFactory));
我任务PktSingleFactory就相当于具体工厂,将具体工厂类注册金抽象工厂类

void asynDBCenter::GetUserInfo(std::function<void(bool bExist, const ShuiHu::UserInfo& hr)>* fnGetUserInfo, const char* pszName)
{

    //抽象工厂根据注册进去的具体工厂创建具体产品,但有点疑问就是抽象工厂具体工厂可以创建多个具体产品类的实例,但CreatePkt是显示的去new
    DB::AskUserInfo* pAskPkt = dynamic_cast<DB::AskUserInfo*>(m_pPktFacMgr->CreatePkt(DB::eDBOpt_AskUserInfo));

    //InterruptStream流内部封装操作,没什么
    DB::InterruptStream SendStream(m_pSendBuffer, eMaxSendBufferSize);
    DB::DBOptID eOptID = pAskPkt->GetID();
    SendStream.CopyIn(&eOptID, sizeof(DB::DBOptID)); // 操作ID

    pAskPkt->m_uFlag = (unsigned __int64)fnGetUserInfo; // 识别标记
    strncpy(pAskPkt->m_aUserName, pszName, MAX_NAME_LEN);
    pAskPkt->Write(SendStream);

    //DestroyPkt又显示的delete,每次发包去new,delete容易造成内存碎片
    m_pPktFacMgr->DestroyPkt(pAskPkt);

    PushShmInter(SendStream);
}

DBSvr那边根据接收的数据创建介入式流,从其中读取ID创建相应的包,然后从包从介入式流中读取数据,在根据包的ID解析数据访问数据库
时间: 2024-08-05 07:06:37

数据库发包的相关文章

GS与数据库打交道

GS与数据库打交道 link_stat stat = (link_stat)rPkt.size; if (stat == link_stat::link_connected) { GameChannel* pNewGC = new GameChannel(); pNewGC->m_nChannelId = rPkt.channel_id;//客户端唯一标识 pNewGC->m_pDataLayer = m_spDataLayer.get();//GC直接发包到客户端 pNewGC->m_

缓存与数据库一致性保证

本文主要讨论这么几个问题: (1)啥时候数据库和缓存中的数据会不一致 (2)不一致优化思路 (3)如何保证数据库与缓存的一致性 一.需求缘起 上一篇<缓存架构设计细节二三事>引起了广泛的讨论,其中有一个结论:当数据发生变化时,"先淘汰缓存,再修改数据库"这个点是大家讨论的最多的. 上篇文章得出这个结论的依据是,由于操作缓存与操作数据库不是原子的,非常有可能出现执行失败. 假设先写数据库,再淘汰缓存:第一步写数据库操作成功,第二步淘汰缓存失败,则会出现DB中是新数据,Cach

jdbc数据库简要操作

JDBC操作步骤 1.加载数据库驱动程序:各个数据库都会提供JDBC的驱动程序开发包,直接把JDBC操作所需要的开发包(一般为*.jar或*.zip)直接配置到classpath路径即可. 2.连接数据库:根据各个数据库的不同连接的地址也不同,此连接地址将由数据库厂商提供,一般在使用JDBC连接数据库的时候都要求用户输入数据库连接的用户名和密码,用户在取得连接之后才可以对数据库进行查询或更新的操作. 3.使用语句进行数据库操作:数据库操作分为更新和查询两种操作,除了可以使用标准的SQL语句之外,

Atitit.跨语言数据库db&#160;&#160;api兼容性&#160;jdbc&#160;odbc&#160;ado&#160;oledb&#160;增强方案

Atitit.跨语言数据库db  api兼容性 jdbc odbc ado oledb 增强方案 1. 跨语言db api兼容性..1 2. 目前访问数据库的接口很多.比较常用的jdbc odbc 以及c api (php用此接口),共约101个类+128个c函数1 2.1. Jdbc api数量  约60个类..java.sql包下面的..大概几百个方法函数吧..2 2.2. Odbc api数量::约78个,odbc是个非oo的api2 2.3. C api (mysql ): 约50个..

基于C#的MongoDB数据库开发应用(4)--Redis的安装及使用

在前面介绍了三篇关于MongoDB数据库的开发使用文章,严格来讲这个不能归类于MongoDB数据库开发,不过Redis又有着和MongoDB数据库非常密切的关系,它们两者很接近,Redis主要是内存中的NoSQL数据库,用来提高性能的:MongoDB数据库则是文件中的NoSQL数据库,做数据序列号存储使用的,它们两者关系密切又有所区别.本篇主要介绍Redis的安装及使用,为后面Redis和MongoDB数据库的联合使用先铺下基础. 1.Redis基础及安装 Redis是一个开源的使用ANSI C

在Linux系统下安装大于mysql5.5版本的数据库

linux下mysql 5.5的安装方法: 1.安装所需要系统库相关库文件      gcc等开发包,在安装linux系统的时候安装. 2.创建mysql安装目录 # mkdir -p /usr/local/mysql/ 3.创建数据存放目录 # mkdir -p /service/data/ 4.创建用户和用户组与赋予数据存放目录权限 # groupadd mysql # useradd -g mysql mysql # chown mysql:mysql -R /service/data/

mysql数据库的参数以及性能的调配

 mysql数据库的特性以及参数性能 一:mysql与其他数据库的比较 MySQL是一个关系型数据库管理系统,开发者为瑞典MySQL AB公司,现在已经被Sun公司收购,支持FreeBSD.Linux.MAC.Windows等多种操作系统与其他的大型数据库例如Oracle.DB2.SQL Server等相比功能稍弱一些 1.可以处理拥有上千万条记录的大型数据 2.支持常见的SQL语句规范 3.可移植行高,安装简单小巧 4.良好的运行效率,有丰富信息的网络支持 5.调试.管理,优化简单(相对其他大

java直接存取MS Access的mdb数据库文件

jdbc 访问 access 的 mdb 数据库文件,使用一个叫ucanaccess的开发包实现这个功能. "Supported Access formats: 2000,2002/2003,2007,2010/2013 databases (1997 read-only)." 官网在 http://ucanaccess.sourceforge.net/site.html 现在被墙. Use UCanAccess JDBC Driver :Class.forName("net

CentOS6.7 Mysql5.6.35版本 源码编译+Mysql数据库忘记root密码如何修改

源码编译MySQL [[email protected] ~]# yum install cmake nucrses-devel –y      //安装编译环境及终端操作的开发包 -- Installed: cmake.x86_64 0:2.8.12.2-4.el6 Dependency Installed: libarchive.x86_64 0:2.8.3-7.el6_8 Complete! 下载软件包 [[email protected] ~]# wget http://ftp.ntu.