【问题标题】:C# DataSource Class and Thread SafetyC# 数据源类和线程安全
【发布时间】:2010-03-03 11:39:00
【问题描述】:

用 C# 编写 .NET3.5 线程安全数据源类的好方法是什么。该类将连接到 SQL Server,并且每个方法都将执行一个存储过程。

当代码单线程工作时。我有一个带有私有 SqlConnection 成员的 Singleton DataSource 类。每个方法打开和关闭该连接。当使用多个线程运行它时,在某些情况下连接已经被另一个线程打开时会导致麻烦。重写这个类的最好方法是什么?

注意:DataSource 不是指任何内置的 .NET 类,而是向控制器提供数据的 Model 类。

【问题讨论】:

    标签: c# sql-server multithreading thread-safety


    【解决方案1】:

    为什么不直接使用内置的 ado.net 池:在操作之前创建并打开连接,并尽快处理 - 对于每种方法。

    【讨论】:

      【解决方案2】:

      问题似乎来自 Singleton 设计。这仍然可以工作,只需确保您将连接存储为字段。仅在每个方法中使用局部变量来保持连接。这在设计上应该是线程安全的。

      并使其成为异常安全的:

       using (var conn = new SqlConnection(...))
       {
          // call SP
       }
      

      【讨论】:

        【解决方案3】:

        SQL Server 已经通过非常复杂的机制来协调线程。您无需执行任何特定的操作来实现线程安全,只需执行存储过程。

        【讨论】:

          【解决方案4】:

          您必须详细说明您的 DataSource 类应该做什么。如果您的每个 Create/Read/Update/Delete 方法不改变任何状态,则无需实现任何线程安全代码。

          更新:在您的情况下,我建议您在 DataSource 类的每个方法中重新创建一个新的 SqlConnection 实例,因为 ADO.NET 已经为您处理了池。

          【讨论】:

          • 是的,如果您愿意,您当然可以使用 Singleton,尤其是当您的应用程序没有连接到多个数据库时。 (请记住,Singleton 模式现在已被弃用,建议改用 IoC)。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多