在DAL中的Linq2Sql静态Datacontext

时间:2012-10-09 10:00:06

标签: c# asp.net linq-to-sql data-access-layer datacontext

我是Linq to sql的新手。我的问题很简单。

将DataContext作为DAL中的公共静态成员作为单例是否是一个好主意?

5 个答案:

答案 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)中使用静态DataContextThe MSDN documentation for DataContext声明:

  

不保证所有实例成员都是线程安全的。