【问题标题】:Linq2Sql static Datacontext in DALDAL 中的 Linq2Sql 静态数据上下文
【发布时间】:2012-09-29 15:13:32
【问题描述】:

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

将 DataContext 作为 DAL 中的公共静态成员以充当单例是个好主意吗?

【问题讨论】:

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


    【解决方案1】:

    DataContext 保持为单例并不是真正的好主意,对于小型应用程序,您可能看不到任何后果,但如果您的 Web 应用程序有很多用户可以访问,则会导致内存泄漏。为什么?

    DataContext 基本上在后台实现工作单元,其内部具有内部缓存,以跟踪实体的变化并避免在一次业务事务中往返于数据库。将DataContext长时间保持为静态,表示内部缓存会暂时增加,不会正常释放。

    DataContext 应保存在一个业务事务中并尽快释放。 Web 应用程序的最佳实践是根据请求保留DataContext。你也可以使用 IoC Container,大部分 IoC Container 都支持这个。

    【讨论】:

      【解决方案2】:

      我在 DAL 中使用共享数据上下文时也经历过一件事。假设有两个用户 A 和 B。如果用户 A 启动并进行事务处理,那么用户 B 可以提交用户 A 所做的更改,这是使用静态 DataContext 的副作用。

      【讨论】:

        【解决方案3】:

        我通常尝试将数据访问类的功能组合在一起并使该类 IDisposable。 然后在构造函数中创建 DataContext,并在 dispose 方法中对 DataContext 运行 .dispose() 调用。

        因此,当您需要该类中的某些内容时,您可以将其包装在 using 语句中,并使用相同的 DataContext 进行一系列调用。

        这与使用静态 DataContext 的效果几乎相同,但意味着您不要忘记关闭连接,而且它似乎比将事物设为静态更 OO。

            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】:

          我建议您阅读'unit of work' 模式。 IE。 http://stuartharris4.blogspot.com/2008/06/working-together-linq-to-sql.html

          【讨论】:

            【解决方案5】:

            您绝对不应该在 ASP.NET 等多线程应用程序中使用静态 DataContextThe MSDN documentation for DataContext 声明:

            不保证任何实例成员都是线程安全的。

            【讨论】:

            • 我读了这个链接老兄。这很漂亮,而且信息量很大。感谢分享。 :)
            猜你喜欢
            • 2012-07-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-06-24
            • 2023-04-06
            • 1970-01-01
            • 2020-05-24
            相关资源
            最近更新 更多