我在Linq to SQL中有一些困惑。我正在寻找数据上下文类有时会给出以下异常的实际原因。
“已经有一个与此命令关联的开放数据阅读器必须先关闭
特别是在多任务处理环境中。大多数人都说原因是,数据上下文不是线程安全的。所有建议使用DataContex作为每个工作单元。
请参阅以下主题以获取最佳答案
Linq-to-SQL Data Context across multiple threads
但在我的情况下,我正在使用另一个类调用“A”,它以Singleton模式实现。这个类的用途是,以单例方式提供数据上下文对象。我正在维护这个类“A”的实例作为全局派生类中的实例,并使用特定实例调用Datacontex。
我的问题是,
我的方法调用是否会导致无法控制的内存增长?根据我的理解,单例将一个实例维护为静态对象。如果我的假设错了,请给我很好的解释。
注意:
我的方法调用也会抛出同样的异常。所以我确定在这个场景中也会发生同样的问题。
答案 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。好吧,在多线程环境中,静态对象会导致碰撞,就像您看到的错误一样。你很幸运能得到这些错误。使用多个线程,您可以从另一个线程提交更改,然后让原始线程提交导致大混乱。
我坚持非静态实现。真我,我知道这很令人失望,我真的也想在这里使用这种模式。