饭中淹的避难所~~~~~

偶尔来避难的地方~

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  94 随笔 :: 0 文章 :: 257 评论 :: 0 Trackbacks
【数据库部分】
数据库的表结构方面没有特殊要求。
所有操作都必须做成存储过程供应用程序来调用。
每个存储过程的首参数是一个输出的int,名为ret。其他参数排布在其后。
存储过程中所有操作使用事务包裹起来,并设置异常处理。处理方式是rollback,并设置ret为约定的缺省错误码(实际使用时设置为-1)
存储过程向应用程序返回数据时,用“select 行标识,其他字段”的方式。其中,行标识的作用是指定该条数据的类型。这个类似网络通信封包的命令号的概念。
ret为OK(实际使用时值为0)表示存储过程无错执行。其他值表示有错误。
存储过程要返回错误时,设置ret为要返回的错误号码,并rollback,然后leave最高层begin,end。

【应用程序部分】
调用存储过程时,使用统一的接口,调用参数打成一个包(实际使用时采用网络封包相同的容器)。
返回的数据行,通过行首的“行标识”字段来识别其数据含义。
当返回的ret不是OK值(0)时,则不处理返回的任何数据行。
【优化】
建立数据库连接池。
在线程池中进行存储过程的调用。并对返回数据进行打包(vector)
在逻辑线程中进行数据的处理。
使用协程技术,将异步的数据库操作变成同步的执行顺序。
【通用性和扩展性】
调用时使用的是封包容器,所以整个应用程序(一般为服务器应用)数据容器都非常统一,而且接口也可以做成非常一致。简单的说就是像发网络封包一样调数据库。
返回的数据,都是带“命令号”的,可以用处理网络封包的方式去处理。在服务器应用中,也是能够和各种服务逻辑统一在一起。
要扩展数据库操作,只要写存储过程,并处理新增的数据命令号即可,减少了很多重复的工作,提高了数据库相关逻辑的开发速度。

posted on 2011-04-28 15:56 饭中淹 阅读(2014) 评论(2)  编辑 收藏 引用 所属分类: 游戏服务器

评论

# re: 【一种通用性扩展性较强的数据库解决方案】 2011-04-28 19:52 megax
我记得,这是很久以前很久以前使用vb的时候的做法了吧。。。现在是orm的时代喽  回复  更多评论
  

# re: 【一种通用性扩展性较强的数据库解决方案】 2011-04-29 07:39 饭中淹
@megax
Vb的数据库部分没用过,不清楚
不过c++里面数据库的orm不是很好实现,也没有很多好的库。
另外是效率和异步考虑,数据库操作必须可控
还有必要的灵活性
所以使用了存储过程和连接线程池

不过,我找到一个新的方法来降低逻辑层的数据库相关复杂度。也是类似对象关系映射,我的方法是根据对象生成一个字段模型(字段偏移和类型表),这个作为映射中心,网络封包、数据库表作为映射源和目标。字段模型可外部编辑并从模型生成实体。

然后底层还是这种连接池。

  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理