【问题标题】:SqlConnection with Parallel programmingSqlConnection 与并行编程
【发布时间】:2018-08-25 00:40:16
【问题描述】:

这是我现有的代码,它将一些数据保存到多个表中

using (SqlConnection conn = new SqlConnection("myConnString"))
{
   DoWork1(conn);
   DoWork2(conc);
   DoWork3(conn);
}

为了加快我的代码速度,所以我尝试获得 .net TPL 支持,我重新挂起我的代码,如下所示

using (SqlConnection conn = new SqlConnection("myConnString"))
{
   ParallelOptions pw = new ParallelOptions();
   pw.MaxDegreeOfParallelism = Environment.ProcessorCount;

   Parallel.Invoke(pw,()=> DoWork1(conn),()=> DoWork2(conc),()=> DoWork3(conn));
} 

但这会在我的数据访问层中的 ExecuteNonQuery() 方法中引发内部连接致命错误异常。我的并行方法是否错误?

【问题讨论】:

  • “我的并行方法有问题吗?” - 很有可能。

标签: c#-4.0 task-parallel-library


【解决方案1】:

嗯,有一些方法可以可能使用MARS 工作 - 但我会建议一种不同的方法。 (我不知道 MARS 是否支持跨多个线程使用相同的连接,即使它允许多个并发操作。)

与其尝试在所有并行任务中重用一个连接,不如让每个任务为自己打开(和关闭)一个连接,并让连接池处理效率方面的问题。无论您是否使用并行,这都是 .NET 中的一般最佳实践:打开连接、做一些工作、关闭连接。

【讨论】:

  • 感谢您的快速响应。我会尝试第二种方法。(每次操作打开和关闭一次连接)
【解决方案2】:

我没有评论的声誉,但似乎我可以回答。 这有点奇怪 无论如何,我的评论是临时表是每个连接的,所以打开一个新连接意味着你看不到其他任务创建的临时表。

全局临时表可能是答案,但您要么必须这样做 a) 使用单个全局临时表并使用某个键对数据进行分区 b) 使用唯一命名的表,这意味着动态 sql

真的有点乱

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多