微软没有成熟的内存数据库可用,当游戏或者大型应用。
频繁修改对象访问(可以对应到数据表)状态时,IO性能将成为系统瓶颈。
MemeCached不能解决全部问题,尤其是级联查询非主键字段的情况。
因此需要有个内存数据库的架构,加大内存,缓解IO。我思考,是否可以用DataSet实现内存数据库?1,有一个全局的静态的DataSet名叫DS,结构和物理数据库完全一致,可以在项目启动时,映射到内存里,数据是空的。
2,大量并发访问时,查询时发现内存中没有的数据,再从物理数据库灌进来,同时进缓存MemeCached
3,有主键的数据从集群缓存MemeCached里取。
3,插入和修改先进DS,延迟一段时间再进物理库。
4,DS的大小自动维护,不超过系统内存可用量。以上只是思路,想看看大家思考后会有什么结果,预料到什么问题?

解决方案 »

  1.   

    DS在一个机器上,MemeCached在其他很多机器上。
      

  2.   

    想法很不错!
    这方面我也不太懂,不过按照“3,插入和修改先进DS,延迟一段时间再进物理库。”这一条来说是不是需要维护一个很大的消息队列来控制DS数据-->物理数据库的操作?
      

  3.   

    恩,工作量肯定很大。
    Dictionnary<T,Dictionnary<T,T>>这样的结构也会非常多,而且是自动生成的。
    为了加快查询速度,用这个东西做索引。而且,这个DS是专门一台机器,跑在WCF状态机程序里的。
    (或者其他更快的通讯机制MSMQ,RabitMQ之类的)
      

  4.   

    3,插入和修改先进DS,延迟一段时间再进物理库。
    ======
    如果数据加中 存在"假删"操作,即通过update某条数据的某个字段来实现冻结此条数据
    这一操作先进DS 后持久化进库
    那么在这段"延迟"时间内,这条数据还是有效的?
      

  5.   

    DS操作的时候能实现 for update吗?
    如果不能,排他怎么处理?DS与实际DB交互的时间间隔需要考虑一下,太频繁就没有意义了,但如果间隔太久,万一断电什么的,损失会很大
      

  6.   

    还有,datatable和dataview虽然可以支持简单SQL的效果,但一些复杂SQL处理起来就麻烦了,如果复杂SQL直接去访问DB的话,就会因为DS与DB交互延时会对数据整合性有影响个人感觉如果要实现的话,比较困难
      

  7.   

    别把 DataSet 看的太强大了    小子不能当超人用的 
      

  8.   

    当碰到性能瓶颈后,不能在用原有的思维去考虑。而应该跳出这个框框去解决问题。
    更好的方法是把windows全部放在内存里面运行。然后定时镜像数据库。
    现在已经有很好的解决方案了。楼主可以参考一下。
    另外不建议dataset。因为dataset本来就是瓶颈。
    你可以创建自己的表结构,用文件和hashtable来模拟。
    如果非要用到数据库的话,最好批量处理。Bulk insert就是一种很好的方式。
      

  9.   

    2,大量并发访问时,查询时发现内存中没有的数据,再从物理数据库灌进来,同时进缓存MemeCached===========================如果访问的数据频繁变化,DS读入操作岂不频繁进行
      

  10.   

    想法很好做好数据备份应该就可以了。 把及时数据与常规数据分开,及时数据直接放在ds中,每隔一定的时间导入数据库。用户操作直接读写ds应该是很快的。
      

  11.   

    我提提自己的小观点小见解,说错了。别介意:
    1。Dataset的内存更新数据后再延迟执行到物理数据库更新,这段时间,要适当均衡下 你系统会不会挂掉
    或特殊情况下的数据丢失问题,此时就真的不好在要求强事务环境下维护使用,另外DataSet的数据如果很大批量更新性能速度,个人曾有小尝试过,不是很理想.(泛型的循环插入再由事务最终提交的批量更新方式性能还可以)
      

  12.   

    2。Dictionnary模式只能单个列快速检索,多层嵌套反增加字典代码的阅读可读性和可维护性,我觉得如果在只检索查询下确实性能不错,但字典内部机制会出现一个版本检查异常问题,刚好您的项目又是字典做公用然后又需要修改这个公用字典,如果还加入多线程环境去操作那控制比较麻烦(可能你会用锁机制或实现IClone接口)所以个人感觉就不是很理想。反而我依据是否频繁修改来决定要不要使用字典,否则我更喜欢泛型。
      

  13.   

    3。您对数据库方面很厉害的,以前我曾有看过您的某些表关系设计的确很牛B,个人感觉,有时为了后续项目性能和开发难度考虑,其实表设计偶尔可以不那么严.格-遵循 -数据库三.范.式,规范是死的,但定的太.死,有时的确很耗费开发效能和性能优化要求。
    4。 个人感觉居于DataSet公用缓存,还不如居于内存映射文件方式进行架构处理-I-O问题。
      

  14.   

    DataSet 本事就是一个数据缓冲区,它从本质上说,就是数据库中的表在内存中的映射,实现的也是对速度瓶颈的缓解,应该没有什么问题的吧
      

  15.   

    有个用c#写的内存数据库sharphsql
      

  16.   

    DataSet+linq我感觉还不错。MySql有提供内存数据库功能。问题的保姆,帖子的管家——《Csdn收音机》!
      

  17.   

    将Mysql改成:分布式内存数据库
    http://hi.baidu.com/free_specter/blog/item/a69279f46328d168dcc474e9.htmlmemcache_engine
      

  18.   

    版主的想法,我也正有此意,您的帖子是我在google上用:dataset 内存数据库,搜到的。
    我想,起码对于只插入,不修改的情况,会有较大改善的,我顶你!!
    也希望如果您有成果的话,请与我联系,我期待您的好消息。我这几天研究oracle的timesten,我觉得这个timesten 就可以用dataset来实现嘛!不用很痛苦的配置了