【问题标题】:linq to sql in a multithreaded environment ( and WCF)多线程环境(和 WCF)中的 linq to sql
【发布时间】:2011-04-13 06:53:26
【问题描述】:

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

如果它会变得复杂,我想我们会将 linq 转储到 sql 并回滚到连接的方法..(?)

基于 (Per Call)WCF 的 API 端提出了类似的问题:我们对所有 WCF 函数调用使用单例 DataContext 对象吗?还是我们应该为每个 WCF API 调用启动一个 DataContext?

谢谢! 提供

【问题讨论】:

    标签: linq wcf linq-to-sql


    【解决方案1】:

    DataContext

    不保证任何实例成员都是线程安全的。

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

    请注意(默认情况下)数据上下文会跟踪它们加载的记录实例——这些实例也不应该在线程之间共享。这些跟踪记录实例在被请求时不会自动刷新数据库中的更改。

    请注意,对数据上下文调用 SubmitChanges 会将其跟踪的所有已修改记录发送回数据库...这对于多个用户共享数据上下文可能非常糟糕,即使锁定也是如此。


    也来自同一篇文章:

    一般而言,DataContext 实例旨在持续一个“工作单元”,但您的应用程序定义了该术语。 DataContext 是轻量级的,创建起来并不昂贵。典型的 LINQ to SQL 应用程序会在方法范围内创建 DataContext 实例,或者将其作为代表一组相关数据库操作的逻辑集合的短期类的成员。


    如果它太复杂,我想我们会将 linq 转储到 sql 并回滚到连接方法..

    您也不应该在未实现锁定的情况下在线程之间共享 SqlConnection 对象。

    【讨论】:

    • “工作单元”是关键。保持 DC 的使用寿命非常短。经常使用其中的许多。不要到处传输实例(当然跨线程)。使用 IoC 提供商来管理为您创建它们(这就是我所做的)。
    【解决方案2】:

    线程有自己的变量和引用堆栈。所以是的,我相信每个线程都需要一个 DataContext。

    【讨论】:

    • -1 第二个语句不遵循第一个语句。在线程之间共享(DataContext)实例很容易。
    猜你喜欢
    • 2011-06-22
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    相关资源
    最近更新 更多