在ASP.NET中管理DataContext的好方法?服务器恢复事务失败

本文关键字:方法 服务器 恢复 失败 事务 NET ASP 管理 DataContext | 更新日期: 2023-09-27 18:06:51

我们使用以下类为每个请求创建一个Linq2Sql DataContext:

public static class DataContextManager
{
    private const string HTTPCONTEXT_KEY = "DataContextManagerKey";
    private static CompanyDataContext _staticContext; //when there's no HttpContext (in test/debug situations). 
    public static CompanyDataContext Context
    {
        get
        {
            if (_Context == null)
            {
                _Context = NewContext();
            }
            return _Context;
        }
    }
    private static CompanyDataContext _Context
    {
        get
        {
            return (CompanyDataContext)(HttpContext.Current != null ? HttpContext.Current.Items[HTTPCONTEXT_KEY] : _staticContext);
        }
        set
        {
            if (HttpContext.Current != null)
            {
                HttpContext.Current.Items[HTTPCONTEXT_KEY] = value;
            }
            else
            {
                DataContextManager._staticContext = value;
            }    
        }
    }
    public static void Dispose()
    {
        CompanyDataContext context = _Context;
        if (context != null)
        {
            if (Config.Instance.TestMode) context.Log.WriteLine("--- DISPOSING DATACONTEXT ---");
            context.Dispose();
            _Context = null;
        }
    }
    public static CompanyDataContext NewContext()
    {  
        CompanyDataContext db = new CompanyDataContext();
        db.CommandTimeout = Config.SQL_COMMAND_TIMEOUT;
        if (Config.Instance.TestMode)
        {
            db.Log = new ConsoleTextWriter();
            db.Log.WriteLine("--- CREATING NEW DATACONTEXT ---");
        }
        return db;
    }
}

And

protected void Application_EndRequest(Object sender, EventArgs e)
{
    DataContextManager.Dispose();
}

我问的原因是,我们突然得到随机的"SqlException:服务器未能恢复事务"异常,每天一次或两次的代码,曾经完美地工作。在这个异常之后,我们会得到很多其他的异常,直到我们重新启动web应用程序。有人见过这种行为吗?

我们在IIS 6上运行asp.net 2.0和SQL server 2005。

更新:

只是为了不让别人犯和我们一样可怕的错误:

事实证明,一些工作线程也使用了DataContext,但没有HttpContext,他们当然得到了_staticContext (DataContextManager的一个功能,仅在测试时使用)。我们在工作线程中重写了代码,以确保每个线程都有一个DataContext,并在完成时处理它。到目前为止,一切都工作了2周:)

在ASP.NET中管理DataContext的好方法?服务器恢复事务失败

这是一个糟糕的模式。首先,你不应该有一个静态数据上下文,它实现了IDisposable,这样一个线程可以尝试使用上下文,而另一个线程正在处理它,再加上许多其他潜在的问题。每个http请求一个数据上下文也不好,数据上下文被设计为用于单个事务,然后被处理。如果检索更新/插入/删除并使用相同的上下文检索,则会出现问题,第二次检索不反映更新/插入/删除的更改。删除静态上下文,只让context属性每次返回一个新上下文。您仍然可以在请求结束时通过将它们全部粘贴到List属性中并遍历它来处理all。