2

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

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

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

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

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

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

我的问题是,

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

笔记:

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

4

2 回答 2

9

您的方法通常会导致问题。ADataContext不打算成为单例。只是不要这样做。

即使A是单例,也要DataContext在 中的适当方法中创建一个新的A,而不是在DataContext中将 a 作为变量A。(您可能还想首先考虑是否A真的应该是单例。)

于 2013-06-20T19:11:05.260 回答
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 实例设置为静态。好吧,在多线程环境中,静态对象会导致冲突,就像您看到的错误一样。你很幸运能得到这些错误。使用多个线程,您可以从另一个线程提交更改,然后让原始线程提交导致大混乱。

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

于 2013-08-26T21:22:23.010 回答