【问题标题】:if i have a static class with a dbcontext field, does that mean the connection stays open for the life of the application?如果我有一个带有 dbcontext 字段的静态类,这是否意味着连接在应用程序的生命周期内保持打开状态?
【发布时间】:2013-09-06 19:02:55
【问题描述】:

这可能是一个显而易见的问题... 下面是我用于与数据库交互的静态类的骨架。我的问题是:如果一个静态类在应用程序的持续时间内存在,那么这是否意味着字段 _context 将有一个连接保持打开那么长时间?,或者如果我用 using 包装我所做的调用声明,我可以确信连接只会按预期打开和关闭吗?

public static class MyStaticClass
{
    private static dbEntities _context;

    static MyStaticClass()
    {
        _context = new dbEntities();
    }

    private static void UpdateContext()
    {
        _context = new dbEntities();
    }

    public static bool DoSomething(int id)
    {
        using (var context = _context)
        {
            var result = (from x in context.table.where(p=>p.id == id) select x).FirstOrDefault();
        }
    }
}

【问题讨论】:

  • 如果你在 using 中包装它的使用,那么你将在第一次调用后简单地使用一个处置的对象,它不会工作。
  • 即使我在 using 语句之后调用显示的 updatecontext 方法来更新上下文?
  • 考虑使用static dbEntities GetContext() 代替字段和Update 方法。使适当的范围界定方式更简单。
  • 你可以自己试试看。如果您能够重新初始化已经释放的对象,那么为什么要首先释放它呢?您又回到了始终持有其资源的状态。最好每次都创建一个新的上下文。如果您打算每次都创建一个新的上下文,那么保留已经处理的旧上下文有什么用。对你没用。

标签: c# entity-framework dbcontext static-classes


【解决方案1】:

如果您有一个静态上下文,那么这意味着该对象持有的所有资源都将在应用程序期间被持有,是的。

如果你将它的使用包装在一个 using 中,那么你只会在第一次调用后使用一个已释放的对象,它不会工作。

相反,您应该在较小的范围内简单地创建新的数据上下文。不需要它是一个长寿的对象。连接池有助于确保创建多个短期上下文的成本不会比一个长期上下文昂贵。

让每个上下文代表一个逻辑操作,然后为下一个操作创建一个新的。

【讨论】:

  • 这是我习惯的方式,现在它非常有意义。我想我正在寻找一条行不通的捷径。
【解决方案2】:

您需要确保 dbcontext 类是线程安全的,否则如果您的应用程序同时拥有多个用户,一个用户可以关闭另一个用户的连接或接收他没有询问的数据,您将遇到非常严重的问题为了。

【讨论】:

    猜你喜欢
    • 2019-04-16
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多