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

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

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

  • 相关阅读:
    LOJ 6089 小Y的背包计数问题 —— 前缀和优化DP
    洛谷 P1969 积木大赛 —— 水题
    洛谷 P1965 转圈游戏 —— 快速幂
    洛谷 P1970 花匠 —— DP
    洛谷 P1966 火柴排队 —— 思路
    51Nod 1450 闯关游戏 —— 期望DP
    洛谷 P2312 & bzoj 3751 解方程 —— 取模
    洛谷 P1351 联合权值 —— 树形DP
    NOIP2007 树网的核
    平面最近点对(加强版)
  • 原文地址:https://www.cnblogs.com/virusswb/p/1642055.html
Copyright © 2011-2022 走看看