zoukankan      html  css  js  c++  java
  • 关于.NET大数据量大并发量的数据连接池管理 Virus

     

        首先声明,本人以前做的都是小应用,还没有设计过百万、千万数据量的应用,并发量上万的应用,很多时候都是Applicatiion ServerDB Server在一台机器,或者将DB Server分离出来,单独在一台机器。由于最近的工作需要,故产生很多疑问,想要和大家一起探讨,向大家学习,希望大家不吝赐教,感谢大家的参与。

        首先提一下本文的需求来源和具体的需求。

        需求的来源:

        本文的需求产生于公司最近的产品,是一个互联网应用,考虑到将来的数据量会很大,大概单表上亿条记录,并发量可能也会很大,大概十万、甚至百万的并发访问。

        技术选型:

        数据库:MS SQL Server 2005

        平台选择:ASP.NET 3.5 SP1

        开发工具:VS2008 SP1

        其他类库或框架:JQuery NHibernateEntity Framework

        需求:

        1、数据库架构

        大数据量在数据库的存储问题,单表存放的话,上亿条数据是否太多,有的数据经常使用,有的数据常年不用,是否考虑要分两张表(不过找高人问了一下,自己也找了一些资料看了一下,好像有一种叫做分区表,好像就是用来解决类似问题的,具体可以参考微软的官方资料:http://msdn.microsoft.com/zh-cn/library/ms345146(SQL.90).aspx)。

        2、应用架构

        这回肯定要将Application ServerDB Server分开,而且数据库可能还要集群,Application Server可能还要做NLB(Network Load Balancing 网络负载均衡)管理。而且在数据库连接方面如何设计更好呢?是否应该使用连接池?连接池如何管理呢?保持固定连接数量,然后做好分配工作?还是每次连接都重新打开,然后关闭,只在服务器IIS和数据库做好设置就可以了呢?

        3ORM工具选择

        基本选定两种:微软的Entity FrameworkNHibernate,不知道那种更合适呢?微软的东西肯定和自己的软硬件搭配更好,可是EF是新东西,不知道应用在我上面提到的大型应用中是否合适?大家请给点提示!!!NHibernate是否更成熟呢?毕竟有Hibernate的多年经验做支持,那个更好呢,希望大家给点提示!!!!

     

        下面我将给出我的应用架构设计的一些想法,不成熟,不正确的地方希望大家给予指点,稍后我会将大家的补充和指在再写成一篇blog,以供大家参考。

        下面的应用分类只是我自己的一些理解,不合理的地方,也请大家指出来。

        1、小型应用

     

        这时候Application ServerDB Server在一起服务器上,两个角色和在一起,这种适用于访问量较小,数据量也较小,并发量也较小,甚至没有并发。

        每次的数据连接,是需要访问数据库就打开,用完就关闭,当然了,要设置IIS的并发量和数据库的并发量,还有web.config中的数据库连接池的设置。

    <add name="DefaultConnectionString" connectionString="Data Source=192.168.1.2;Initial Catalog=abc;User ID=sa;Password=sa;Enlist=true;Pooling=true;Max Pool Size=500;Min Pool Size=0"/> 

     

         2、中型应用

     

        这时候就需要将Application ServerDB  Server分开在两台机器了,可以使得数据库可以充分享受各种IO资源,大内存、大IO,使得数据库发挥最大功效,可以在一定程度提升很多的性能。这种适用于访问量开始增大,数据量也表较大,并发也需要考虑了,可能会上几十、几百之类的。这时候,并发数量的各种设置也是必须的,具体的数值是要根据测试才可以合理的。

        这时候的数据库连接可能还是可以采取每次打开,然后关闭的方式。

     

     

       

        3、大型设置更大型的应用

     

        这时候的Application ServerDB Server都不只是一台可以解决的了,Application ServerDB Server都需要做NLB才可以解决的。因为,这时候的数据量可能会上亿,数据库的大小会TB级别,并发量会上万、十万、百万、甚至千万级别。

        这时候的数据库连接就需要仔细考虑了,有两个选择。

    • 一种还是前面的办法,设置好各个地方的并发连接量,然后每次还是重新连接,用完关闭,如果超出并发数的访问,就等待一下,等待其他连接关闭。

     

    • 一种就是需要一个连接池,在连接池中保持打开固定数目的连接,如果有需要访问数据库的,就从连接池中找一个没有被使用的连接,给连接的请求者,我考虑,就是在application start的时候就打开固定数目的连接,这些连接需要一个管理机制,因为要标识连接是否空闲,要设置连接的状态,是否正在使用中,但是这些连接不用释放,保持打开,知道应用关闭,连接自动关闭。如果打开的连接被使用完毕,同时又有请求,那就还是要等待。 不知道NHibernate在这方面有没有提供管理共享连接的支持呢?希望知道的老兄可以指点一二!!

     

     

     

        说实话,这两种那个更好,我也说不清楚,还请大家多指教了!!!

      稍后我还要补充几张图让大家可以更直观的讨论,感谢大家的回复。

    Technorati Tags: ASP.NET,架构设计,数据库并发,并发量,数据库连接池,IIS,web.config,数据库设计,分区表,负载均衡,NLB,Network Load Balancing

       

      2010-1-8下午 15:39补充

      经过网友的指正,http并发不等同于sql并发,http并发是向应用服务器的请求,sql并发是向数据库服务器的请求。

       2010-1-8下午 15:39补充

      1、并发还要考虑单位,是秒并发还是分钟并发.

      2、重构也是一个过程,从小数据量考虑起先。参看:http://www.cnblogs.com/wuxilin/archive/2007/07/17/820482.html

      2010-1-9凌晨 0:28补充

      1、补充一些关于连接池的知识

      我以前对.NET连接池的认识是错误的,原来以为在web.config中设置了连接池,每次发起的数据库连接也还是会是新的,每个sql请求就是一个连接,需要打开和关闭。因此就想设计一个连接池,然后保持固定的连接数,需要数据库连接就从连接池中取出来一个给请求用,用完毕就设置连接空闲,等待下次请求。这样看来是多余的,ADO.NET已经为我们提供这样的连接池管理,每个连接字符串产生一个连接池,设置了池的最大连接数,尽管你在DBConnection上使用close或者dispose,连接都没有被关闭,其实是返回到池,由池来管理这些连接,等待下次请求。除非连接池中的连接全部关闭,连接池才从内存中释放。多个不同的的连接字符串,产生多个连接池。

      大家可以参看:

      http://developer.51cto.com/art/200907/140094.htm

      http://www.xueit.com/html/2009-03/21_852_00.html

      http://social.microsoft.com/Forums/zh-CN/adonetzhchs/thread/6cd6b103-46bb-49a4-8f61-2e3527628130

      http://www.cnblogs.com/FallingAutumn/archive/2009/10/30/1593168.html

      http://www.cnblogs.com/FallingAutumn/archive/2009/10/30/1593151.html

      http://msdn.microsoft.com/zh-cn/library/aa175863(SQL.80).aspx

      http://www.cnblogs.com/tuyile006/archive/2008/05/26/1207988.html

      http://dotnet.itpub.net/post/20969/394416

      http://blog.csdn.net/daremeself/archive/2009/04/26/4124886.aspx

      http://hi.baidu.com/puwenbin/blog/item/d3aeba11d76b4b79ca80c4b8.html

      2010-1-20补充,应用架构图

      这次的应用有一部分的客户端为了增加交互性,提高体验,使用了Silverlight3,数据库交互部分使用的是WCF,有一部分后台管理还是用ASP.NET页面来做,数据库交互就直接使用ADO.NET,下面是我的一张程序架构图,希望大家可以指出问题。

    【Blog】http://virusswb.cnblogs.com/

    【MSN】jorden008@hotmail.com

    【说明】转载请标明出处,谢谢

    反馈文章质量,你可以通过快速通道评论:

  • 相关阅读:
    Java编程思想(第三版) 学习笔记
    Python 技术专题
    Interview Tech Knowledge
    Perl语言的多线程(一)
    教你如何拍好人像摄影
    c#,将pdf文件转换成图片文件。
    c#,使用WPF实现iPhone的短信框效果
    c#中利用WMI对象获取物理内存和可用内存大小信息
    c#,使用WMI对象获取系统的DPI。
    c# 调用Microsoft XPS Document Writer打印机,将Pdf文件转换成Xps文件
  • 原文地址:https://www.cnblogs.com/virusswb/p/1642055.html
Copyright © 2011-2022 走看看