【问题标题】:How can I handle a web application that connects to many SQL Server databases?如何处理连接到多个 SQL Server 数据库的 Web 应用程序?
【发布时间】:2010-10-06 17:40:46
【问题描述】:

我正在构建一个将使用 SQL Server 进行数据存储的 ASP.NET Web 应用程序。我正在继承现有的结构,我无法对其进行太多修改。使用此应用程序的人是已付费使用该应用程序的个人公司。每家公司大约有 5 或 10 人将使用该应用程序。大约有1000家公司。按照目前系统的结构方式,每家公司在 SQL Server 实例中都有自己独特的数据库。每个数据库的结构都是一样的。我不认为这是一个好的数据库设计,但我对此无能为力。还有其他应用程序访问了这个数据库,为所有这些应用程序重写数据库接口将是一项艰巨的任务。

所以我的问题是如何为新的网络应用设计架构。每个月的某些时候该网站会获得大量流量。我的感觉是该站点在这些时候表现不佳,因为我猜测当我们有来自不同公司的 500 人同时访问该站点时,他们每个人都会有自己独特的数据库连接,因为他们正在访问不同的 SQL Server 数据库连接字符串。 SQL Server 不会使用任何连接池。我的印象是这很糟糕。

如果他们将客户数量增加一倍会怎样? SQL Server 可以处理多少个唯一的数据库连接?在这种情况下,我应该告诉客户如果他们想要保持可扩展性,他们必须重新设计吗?

谢谢, 科里

【问题讨论】:

    标签: asp.net sql-server connection-pooling


    【解决方案1】:

    您不必为每个数据库创建单独的连接

    我有一个应用程序在同一台服务器上使用多个数据库。我在每个查询前加上“USE dbName;”

    我什至在同一个调用中对两个单独的数据库运行查询。

    至于调用存储过程,这是一个稍微不同的过程。既然你做不到

         Use myDB; spBlahBLah
    

    相反,您必须明确更改连接对象中的数据库。在 .Net 中,它看起来像这样:

         myConnection.ChangeDatabase("otherDBName");
    

    然后调用你的存储过程。

    【讨论】:

    • 嗯...有趣。那么您的应用程序连接到什么数据库?大师?
    • 在这种情况下你能有效地使用存储过程吗?您似乎无法做到,因为您的 SQL 每次都必须即时构建。
    • 它连接到“默认”数据库,而不是主数据库。但为了安全起见,即使查询默认值,它仍然会调用 USE。
    • 我认为这是个好主意。 但是,如果您对每个数据库都有单独的连接,则不必等待 ClientA 的语句完成来执行 ClientB 的语句。我个人不会采用这种方法。
    • @Brad,这是不正确的。您确实可以对同一个数据库运行多个查询,这一切都通过连接池处理。
    【解决方案2】:

    希望您有一个用于常见项目的数据库。在这里,我希望您有一个Clients 表,其中包含IsEnabledLogoPersonToCallWhenTheyDontPayBills 等。为Database(即目录)添加一列,当您使用它时,Server。您的 Web 应用程序将在启动时指向 common 数据库,并为每个客户端构建数据库连接列表。使用表中的ServerDatabase 列以编程方式构建您的数据库连接字符串。


    更新:

    在与@Neil 讨论之后,我想指出我的方法假设一个单例数据库连接。如果你不这样做,那么听我的建议就是愚蠢的。

    【讨论】:

    • 好的。我明白你在说什么。但我的问题更多是关于扩展和性能。我可以按照您的建议进行设置,但这并不能解决性能问题。数据库可以同时处理 500 或 1000 个与 500 或 1000 个不同数据库的连接吗?我的直觉是,这是一个糟糕的设置。
    • 我认为您的意思是,服务器 能否处理与 1000 个不同数据库的 1000 个不同连接。答案是肯定的,服务器可以处理。然而,连接池(在连接字符串中定义——默认为 500)设置在 connection 级别。如果您的所有客户端都在同一个连接上,那么您似乎很快就会遇到上限。
    【解决方案3】:

    缩放是一个复杂的问题。但是,您为什么不扩展 Web 方面呢?然后连接池仅限于 Web 应用程序。

    编辑: 我在这里谈论一般情况。我知道池化发生在许多级别,而不仅仅是 IDbConnection (http://stackoverflow.com/questions/3526617/are-ado-net-2-0-connection-pools-pre-application-domain-or-per-过程)。我想知道提问者是否考虑过在我们的应用程序级别进行扩展。

    【讨论】:

    • 连接池仅限于 IDbConnection。
    猜你喜欢
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多