【问题标题】:Ado.net calling Stored procedure from multi threading is slower than one threadAdo.net 从多线程调用存储过程比一个线程慢
【发布时间】:2016-09-29 03:03:30
【问题描述】:

我试图理解为什么当我使用单线程应用程序时 使用以下代码

    public void Run(object state)
    {
        using (var connection = new SqlConnection(connectionString))
        {
            using (var command = new SqlCommand("UpdatePriceInterval", connection))
            {
                command.CommandType = System.Data.CommandType.StoredProcedure;           
                for (int i = 0; i < 8000; i++)
                {
                    command.ExecuteNonQuery();
                }
            }
        }
    }

对于以下代码,我得到的结果约为每秒 230 个

现在,如果我尝试用任务来完成(当然在循环内部更改为 80 次迭代

for (int i = 0; i < 100; i++)
{
    list.Add(Task.Factory.StartNew(Run, cancel, TaskCreationOptions.LongRunning));
}

我得到的总结果慢了大约 3 秒。(我在 localhsot i7 上运行)

我认为 sp 不是问题(因为我从中删除了所有逻辑)

在 SQL 分析器上,我确保连接是池化的。

我的任务管理器显示一切正常(cpu 内存磁盘网络)没有 100%

我错过了什么?

【问题讨论】:

  • 所以proc是空的?那么这确实应该变得更快。这是网络上的远程服务器,对吧?
  • 是的,proc 是空的,我在本地计算机上尝试过一次,在同一网络上的远程计算机上尝试过一次。结果是一样的
  • 所以proc是空的?为什么在 localhost 上调用一个空的 proc 需要 5ms?这太过分了。发生了什么事。
  • 仅仅因为你创建了一堆任务,它们不需要在不同的线程中运行。看看richnewman.wordpress.com/2012/11/21/…
  • 您也可以在stackoverflow.com/questions/11138927/…@usr 中查看答案

标签: c# sql-server multithreading ado.net


【解决方案1】:

您的“任务”版本正在尝试同时打开许多连接。

因此它可能会在连接池中创建比单线程版本更多的连接,单线程版本只需要在连接池中创建单个连接。

【讨论】:

    猜你喜欢
    • 2012-09-05
    • 1970-01-01
    • 2020-08-15
    • 2020-05-16
    • 1970-01-01
    • 2014-12-11
    • 2017-11-08
    • 1970-01-01
    相关资源
    最近更新 更多