繁体   English   中英

使用Singleton模式对SQL数据上下文进行Linq

[英]Using a Singleton pattern to Linq to Sql Data Context

我对SQL的Linq感到有些困惑。我正在寻找数据上下文类有时给出以下异常的实际原因。

“已经有与此命令相关联的开放式数据读取器,必须先将其关闭

特别是在多任务环境中。大多数人说这是因为,Data Context不是线程安全的。所有人都建议将DataContex作为每个工作单元使用。

请参考以下主题以获得最佳答案

跨多个线程的Linq-to-SQL数据上下文

但是在我的情况下,我正在使用另一个以Singleton模式实现的类“ A”。此类的目的是,以Singleton方式提供Data上下文对象。我将此类“ A”的实例维护为派生的全局实例。类,并使用特定实例调用Datacontex。

我的问题是

我的方法调用会导致不受控制的内存增长吗? 根据我的理解,单例将一个实例作为静态对象。如果我的假设是错误的,请给我很好的解释。

注意:

无论如何,我的方法调用也会引发相同的异常。因此,我确定在这种情况下也会发生相同的问题。

您的方法通常会引起问题。 DataContext不能是单例。 只是不要这样做。

即使A是单身人士, DataContextA内的适当方法内创建一个新的DataContext ,而不DataContext作为A内的变量。 (您可能还想首先考虑A是否真的应该是单身人士。)

我之所以来到这里,是因为我觉得单例模式对于Linq Datacontext也是完美的。 但是在看到您的问题后,原因就变得如此。

这是我如何编写Singleton Linq DataContext的示例:

class DataAccess
{
    private static DataContext db = null;

    private DataAccess()
    {
    }

    public static DataContext GetInstance()
    {
        return db ?? (db = new DataContext());
    }
}

在单例模式中,将DataContext实例设置为静态。 好吧,在多线程环境中,静态对象将引起碰撞,例如您看到的错误。 您很幸运收到这些错误。 使用多个线程,您可以从另一个线程提交更改,然后让原始线程提交,从而导致混乱。

我会坚持使用非静态实现。 真的,我知道这很令人失望,我真的也想在这里使用这种模式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM