将LINQ上下文存储为请求变量还是不存储?

4
这种在一个http请求期间使用LINQ上下文的方法是否可行?几乎每个请求都需要从数据库中选择一些数据并进行一些插入/更新操作。这种方法似乎有效,但我不知道在服务器承载重压和负载均衡的情况下会如何运作,您有任何意见或想法吗?请注意保持上下文在整个请求生命周期中的稳定性。
public static AccountingDataContext Accounting
{
    get
    {
        if (!HttpContext.Current.Items.Contains("AccountingDataContext"))
        {
            HttpContext.Current.Items.Add("AccountingDataContext", new AccountingDataContext(ConfigurationManager.ConnectionStrings["SQLServer.Accounting"].ConnectionString));
        }
        return HttpContext.Current.Items["AccountingDataContext"] as AccountingDataContext;
    }
}
2个回答

3
这在某些层面上是一个不错的想法。但您可能希望将实例化推迟到Begin_Request事件之后。使用集成管道,您将为您网站的每个请求初始化一个相当昂贵的DB Context,包括favicon.ico、所有样式表和所有图像。
最好的、简单的实现方式是只有在有请求上下文时才实例化它,可以参考Ayende针对NHibernate的ISession的示例,只需将其替换为适当的部分以实例化您的L2S上下文即可。

2

我正在使用Unity进行依赖注入,但其实现原理是相同的:

protected void Application_BeginRequest() {
    var childContainer = this.Container.CreateChildContainer();
    HttpContext.Current.Items["container"] = childContainer;
    this.ControllerFactory.RegisterTypes(childContainer);
}

protected void Application_EndRequest() {
    var container = HttpContext.Current.Items["container"] as IUnityContainer;

    if (container != null) {
        container.Dispose();
    }
}

容器负责设置许多内容,其中之一是数据上下文。效果非常好。我还没有做过负载均衡,但我想你在那里也不会遇到问题。请求会获得自己的上下文,这个上下文包装了一个连接到数据库的单个用户。与使用老式的 ADO .NET 进行数据访问没有任何区别。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接