我是Linq to sql的新手。我的问题很简单。
将DataContext作为DAL中的公共静态成员作为单例是否是一个好主意?
答案 0 :(得分:3)
将DataContext
保持为单身并不是好主意,对于小型应用程序,您可能看不到任何后果,但如果您的Web应用程序有许多用户可以访问,那么会导致内存泄漏。为什么呢?
DataContext
基本上在场景后面实现工作单元,内部有内部缓存来跟踪实体的变化,避免在一次业务交易中往返数据库。将DataContext
长时间保持为静态,这意味着内部缓存暂时会增加,并且无法正常释放。
DataContext
应保留在一个商业交易中,并尽快发布。 Web应用程序的最佳实践是根据请求保留DataContext
。您也可以使用IoC Container,大多数IoC Container都支持此功能。
答案 1 :(得分:2)
在DAL中使用共享datacontext时,我也经历过一件事。假设有两个用户A和B.如果用户A启动并执行事务,则用户B可以提交用户A所做的更改,这是使用静态DataContext的副作用。
答案 2 :(得分:1)
答案 3 :(得分:1)
我通常会尝试将功能组合在一起以构建数据访问类,并使该类具有IDisposable。 然后在构造函数中创建DataContext,在dispose方法中,在DataContext上运行.dispose()调用。
那么当你需要来自该类的东西时,你可以将它包装在using语句中,并使用相同的DataContext进行一堆调用。
它与使用静态DataContext几乎相同,但意味着你不要忘记关闭连接,而且它似乎比使静态更加容易。
public class MyDataAccessClass: IDisposable
{
private readonly DbDataContext _dbContext;
public MyDataAccessClass()
{
_dbContext = new DbDataContext ();
}
public void Dispose()
{
_dbContext.Dispose();
}
public List<CoolData> GetStuff()
{
var d = _dbContext.CallStuff();
return d;
}
}
然后在你的班级
using(var d = new MyDataAccessClass())
{
//Make lots of calls to different methods of d here and you'll reuse your DataContext
}
答案 4 :(得分:1)
您绝对不应该在多线程应用程序(如ASP.NET)中使用静态DataContext
。 The MSDN documentation for DataContext声明:
不保证所有实例成员都是线程安全的。