【问题标题】:keeping one connection to DB or opening closing per need保持与数据库的一个连接或根据需要打开关闭
【发布时间】:2011-09-06 00:33:50
【问题描述】:

我在以下案例中寻找最佳实践,并说明每种方式都更好的原因。

我有一个数据库,其中大约有 10~20 个客户端应用程序连接到一个主数据库服务器。

在非常罕见的情况下,每分钟可能有大约 200 次从一个客户端到数据库的调用。

应用程序是多线程的,每个应用程序大约有 20 个线程。

最佳实践是每个应用程序只保留一个与数据库的连接并在每个应用程序中重复使用它。或根据需要打开新连接并快速关闭它们。

我们正在使用 oracle 和 sql-server。

【问题讨论】:

  • 我工作的 DBA 告诉我,打开连接可能需要一段时间,所以最好尽可能重用连接。不过,可能是旧信息 - 不确定:) 有一个您没有提到的中间选项来创建连接池。这样您就可以拥有多个连接,但保持连接打开以提高性能。

标签: .net sql-server database oracle sql-server-2005


【解决方案1】:

这最终是关于您需要在哪里(如果在任何地方)限制您的连接。 在一个纯网络应用程序中,你不能冒几千人同时点击 POST 的风险。另一方面,内部业务应用可能只有六个用户。

您的数据库能否处理 20 个客户,每分钟拨打 200 个电话?单独的线程会并行调用数据库吗?

我倾向于每个客户端都有自己的连接池。

是否有一些客户比其他客户更重要?如果是这样,那么您可能希望一个客户端拥有 20 个连接,而其他客户端拥有 10 个连接。

任何体面的数据库设置都应该能够处理几百个连接,并且如果它们都尝试一次 ping,则不会崩溃。

【讨论】:

    【解决方案2】:

    .NET oracle 提供程序具有内置的连接池功能。每当您需要数据库连接时,创建一个新的连接并立即释放它。连接池将负责高效地重用连接。

    释放连接的最佳方式是通过using 构造,这将确保释放连接,即使发生异常也是如此。

    using(OracleConnection connection = ConnectionFactory.Create())
    {
        connection.DoStuff();
    
    } //connection.Dispose() called here.
    

    【讨论】:

    • 最重要的是,每分钟 200 并不是很多。我通常介于两者之间。就像 pges 打开一个连接一次,然后在完成后关闭它。但我不会正常保留备用连接。
    【解决方案3】:

    最佳做法是尽快处理连接。从技术上讲,连接不会被关闭,只是返回到池中并被其他线程重用。

    SQL Server Connection Pooling (ADO.NET)

    引用自 MSDN:

    我们强烈建议您始终 关闭连接 完成使用它,以便 连接将返回到 水池。您可以使用 的 Close 或 Dispose 方法 连接对象,或通过打开所有 using 语句中的连接。

    【讨论】:

      猜你喜欢
      • 2012-12-04
      • 1970-01-01
      • 2013-09-10
      • 1970-01-01
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多