【问题标题】:SQL Server, connection pools vs static connection for special casesSQL Server,连接池与特殊情况下的静态连接
【发布时间】:2013-01-16 17:35:05
【问题描述】:

我有点知道这个问题的答案,但无法真正掌握基本概念。我知道您现在总是被指示使用连接池。但是想象一下这种情况。

我需要从一个数据库和一个表中多次读取数据。

连接池将注入微秒级的开销,但为什么不通过对所有内容使用单个连接并锁定它来消除它呢?

既然是一个数据库,一张表。我们不太可能从多线程连接池中获得任何性能提升吗?

只是希望在这里有所澄清。也许一些简单的资源可以解释为什么,连接池总是更好。

谢谢。我知道这不是最大的问题,我很感谢你的时间。我专门在 .net 环境中,但这是跨编程的基本概念正确吗?

【问题讨论】:

  • 旁注:跨编程的基本概念之一是“永远不要猜测特定代码的性能 - 尝试和衡量”。还有一个不太基本的算法——没有总是更好的算法——即使是冒泡排序也可以在 3 元素列表上胜过几乎任何东西:)

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


【解决方案1】:
  1. 使用一个全局连接,您需要准备好处理虚假连接失败。这些可能总是发生(网络打嗝,...)。
  2. 您绝对确实在对单个表使用多个并发语句时获得并发。 SQL Server 通常不会以独占方式锁定表(非常罕见)。
  3. 您会忘记在某处使用同步协议(到处锁定)。你最终会弄错的,必须参加比赛。
  4. 如果您有一个会阻塞整个应用程序的慢速失控查询。它会在浏览器中显示为“挂起”。
  5. 您在全局锁上序列化所有 HTTP 请求。您只使用一个 CPU。你根本不会扩展。您的应用无法很好地处理突发事件。

拥有一个单一的全球连接确实是个坏主意。为什么不直接使用池化?这为您节省了使用同步的开发工作。工作量就更少了。

当然,池化并不总是更好。您可以构建不是的病理案例。不过,我从来没有遇到过需要保持连接打开的时间超过当前 HTTP 请求的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    相关资源
    最近更新 更多