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

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

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

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

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

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

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

我的问题是,

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

注意:

我的方法调用的任何方式也抛出相同的exception。所以我相信在这种情况下也会发生同样的问题。

你的方法一般会引起问题。 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实例设置为static。 好吧,在multithreading环境中,静态对象会导致碰撞,就像您看到的错误一样。 你很幸运能得到这些错误。 使用多个线程,您可以从另一个线程提交更改,然后让原始线程提交导致大混乱。

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