2010-09-16 36 views
1

我们设计了一个多线程服务器,它在每个线程上使用linq to sql。测试看起来不太好...从审查我们的代码,有一个很大的问题已经提出:linq to sql是否支持这样的环境? 如果是,我们假设我们应该为每个线程创建一个专用的DataContext对象?如果是的话,这种方法的成本是多少?linq to sql在多线程环境(和WCF)中

如果这将是复杂的,我想我们将转储LINQ to SQL和回滚到连接的方法..

类似的问题,从(每次呼叫)WCF基于API侧凸(?):我们为所有WCF函数调用使用单例DataContext对象?或者我们应该为每个WCF API调用启动一个DataContext?

谢谢! 奥弗

回答

2

DataContext

所有实例成员不能保证线程安全的。

读为:此类不是线程安全的,除非实现锁定,否则不应该在线程之间共享实例。

要知道,(默认)datacontexts跟踪它们加载记录实例 - 这些实例也应在线程间共享。在重新查询时,那些跟踪的记录实例不会自动刷新数据库中的更改。

要知道,在一个DataContext调用的SubmitChanges将所有修改的记录,它是跟踪回数据库......这可能是与多个用户锁定,甚至可以共享一个DataContext非常糟糕。


从同一篇文章

另外:

一般来说,一个DataContext实例设计寿命为一个“工作单位”但是你的应用程序定义的术语。 DataContext是轻量级的,创建起来并不昂贵。典型的LINQ to SQL应用程序在方法范围创建DataContext实例,或者作为表示相关数据库操作的逻辑集合的短期类的成员。


如果这将是复杂的,我想我们将转储LINQ to SQL和回滚到连接的方法..

你也应该不能共享之间的SqlConnection对象线程没有实现锁定。

+1

“工作单位”是关键。保持DC的寿命非常小。经常使用它们中的许多。不要传输实例(当然是跨线程)。使用IoC提供程序来管理为您创建它们(这是我所做的)。 – 2010-09-17 01:54:12

-1

线程具有变量和引用他们各自的堆栈。所以是的,我相信你会需要每个线程的DataContext。

+0

-1第二条语句不从第一条开始。在线程之间共享(DataContext的)实例很容易。 – 2010-09-17 01:35:42