【问题标题】:Using a Singleton pattern to Linq to Sql Data Context使用单例模式到 Linq to Sql 数据上下文
【发布时间】:2013-06-20 19:07:37
【问题描述】:

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

"已经有一个打开的数据读取器与该命令关联,必须先关闭

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

请参考以下帖子以获得最佳答案

Linq-to-SQL Data Context across multiple threads

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

我的问题是,

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

注意:

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

【问题讨论】:

    标签: c# multithreading linq design-patterns linq-to-sql


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。你能详细解释一下,会出现什么样的问题?
    • @Thabo:在多线程环境中,各种事情都可能出错——比如你看到的异常。即使在单线程环境中,您最终也可能会看到缓存数据,以及内存使用量永远增加。你只需要接受DataContext 不是为这样使用而设计的,然后改变你的设计。您不应该权衡利弊 - 不要这样做
    • 。谢谢,但我也有一个疑问。如果我不使用 Singleton,将如何处理并发。?如果总是创建新的 Datacontex 对象,它将如何控制?例如,如果当另一个Datacontext访问同一个表时,Datacontext访问一个表(读取修改)
    • @Thabo:这将取决于他们正在做什么的确切性质......但无论如何你不应该以这种方式控制数据库并发。例如,您可能希望拥有多个服务器,它们都与同一个数据库通信。 LINQ to SQL 有多种并发方法,您应该了解这些方法 - 它们涉及共享单个 DataContext
    • @Thabo:关于 LINQ 的书籍很多。我建议你找一个经过充分审查的。
    【解决方案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 实例设置为静态。好吧,在多线程环境中,静态对象会导致冲突,就像您看到的错误一样。你很幸运能得到这些错误。使用多个线程,您可以从另一个线程提交更改,然后让原始线程提交导致大混乱。

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

    【讨论】:

      猜你喜欢
      • 2011-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      相关资源
      最近更新 更多