2010-03-03 223 views
2

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

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

注意:通过DataSource不要表示任何内置的.NET类,但是提供数据到控制器的Model类。

回答

2

这个问题似乎是来自于Singleton的设计。这仍然可以工作,只要确保你做而不是作为一个字段存储连接。只能在每种方法中使用局部变量来保存连接。这应该是线程安全的设计。

,并使其异常安全,以及:

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

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

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

+0

我已经更新的问题。 – 2010-03-03 11:55:55

+0

仍然使用Singleton? – 2010-03-03 12:43:31

+0

是的,如果你喜欢,你肯定可以使用Singleton,特别是当你的应用没有连接到多个数据库时。 (请记住,Singleton模式现在不推荐使用,建议使用IoC代替)。 – herzmeister 2010-03-03 13:17:05

2

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

3

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