使用Singleton模式到Linq到Sql数据上下文

时间:2013-06-20 19:07:37

标签: c# multithreading linq design-patterns linq-to-sql

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

“已经有一个与此命令关联的开放数据阅读器必须先关闭

特别是在多任务处理环境中。大多数人都说原因是,数据上下文不是线程安全的。所有建议使用DataContex作为每个工作单元。

请参阅以下主题以获取最佳答案

Linq-to-SQL Data Context across multiple threads

但在我的情况下,我正在使用另一个类调用“A”,它以Singleton模式实现。这个类的用途是,以单例方式提供数据上下文对象。我正在维护这个类“A”的实例作为全局派生类中的实例,并使用特定实例调用Datacontex。

我的问题是,

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

注意:

我的方法调用也会抛出同样的异常。所以我确定在这个场景中也会发生同样的问题。

2 个答案:

答案 0 :(得分:8)

您的方法一般会导致问题。 DataContext不是单身人士。只是不要这样做。

即使A是单身人士,也要在DataContext内的相应方法中创建新的A,而不是DataContext作为A中的变量}。 (您可能还想考虑A是否真的应该是单身人士。)

答案 1 :(得分:2)

我实际上来到这里是因为我觉得单身模式对于Linq Datacontext来说也是完美的。但在看到你的问题之后,它就会发生,为什么不是。

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

class DataAccess
{
    private static DataContext db = null;

    private DataAccess()
    {
    }

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

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

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