【发布时间】:2011-08-29 13:58:04
【问题描述】:
我们使用以下类为每个请求创建一个 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;
}
}
在 Global.asax 中:
protected void Application_EndRequest(Object sender, EventArgs e)
{
DataContextManager.Dispose();
}
我问的原因是,我们每天突然出现一次或两次随机“SqlException:服务器无法恢复事务”异常,而代码过去可以完美运行。在异常之后,我们会得到很多其他异常,直到我们重新启动 Web 应用程序。有人见过这种行为吗?
我们在 IIS 6 上运行带有 SQL Server 2005 的 ASP .Net 2.0。
更新:
所以没有人会像我们一样犯同样可怕的错误:
事实证明,一些工作线程也使用了 DataContext,但没有 HttpContext 他们当然得到了 _staticContext(DataContextManager 中的一个功能,仅在测试时使用)。我们重写了工作线程中的代码,以确保每个线程有一个 DataContext 并在完成后处理它。到目前为止,一切都已经工作了 2 周:)
【问题讨论】:
-
您的问题似乎与stackoverflow.com/questions/1388599/… 有关,但那里没有可接受的答案
标签: c# asp.net linq-to-sql