我似乎没有使用mini-profiler获得LINQ2SQL查询?

时间:2013-02-07 12:43:36

标签: .net linq-to-sql mvc-mini-profiler

我有一个2层Web应用程序。 DataAccess和WebSite。

因此,在DataAccess层的dataContext.cs中,我添加了包装器...

  //The autogenreated context when I made the linq2sql class
  public static MyDataContext DataContext
    {
        get
        {
            //We are in a web app, use a request scope
            if (HttpContext.Current != null)
            {
                if (HttpContext.Current.Items["dc"] == null)
                {
                    MyDataContext dc = new MyDataContext ();
                    HttpContext.Current.Items["dc"] = dc;
                    return dc;
                }
                else
                    return (MyDataContext )HttpContext.Current.Items["dc"];
            }
            else
            {
                if (dataContext == null)
                    dataContext = new MyDataContext ();



                return dataContext;
            }
        }
    }

    //the method I added to the autogenreated contex in 
    //an attempt to wrap the profiler around it
    public static MyDataContext Get()
    {
        var sqlConnection = new MyDataContext().Connection;
        var profiledConnection = new StackExchange.Profiling.Data.ProfiledDbConnection(sqlConnection, MiniProfiler.Current);

        return new MyDataContext(profiledConnection);
    }

这就是profileConnection在被调用但在return New MyDataContext(porofiledConnection)

之前的样子

enter image description here

在我的业务逻辑中,在DataAccess层中,我确保使用db = MyDataContext.Get()而不是db = new MyDataContext();

创建数据库上下文。
public class MyOrders(){
  private static  MyDataContext db = MyDataContext.Get();

  public static List<model> GetOrderHistory(){
      var = db.MyStoredProcedure(args) //Inspecting here before execution
      //proces result and return list of model
      }

 }

现在,在某些页面上,我曾经使用SQL线,我可以点击它们并检查它们。但在我浏览网站之后,它只显示了这一点 - 不再有SQL行了吗?就像这个页面只是随机地向我显示SQL重复 - 但如果我重新加载它就消失了。

enter image description here

在此页面上,我从未使用过分析器运行,因为加载时间问题我无法识别它使用的SQL。

enter image description here

我错过了什么吗? SQL缓存了吗?我总是希望看到SQL,即使Linq2Sql缓存它或其他什么。我做错了什么?

1 个答案:

答案 0 :(得分:2)

您的MyOrders课程中有静态数据上下文。 DataContext内部有一个内部缓存,用于跟踪实体的更改,避免在一个业务事务中往返数据库。将其保持为静态意味着内部缓存将暂时增加并且未正确释放。这可能是分析器中查询消失的原因。此外,当多个用户从多个线程访问相同的上下文时,您可能会遇到问题,并且可能是内存泄漏。

来自MSDN的说明:

  

通常,DataContext实例设计为持续一个“单位”   工作“但是你的应用程序定义了这个术语.DataContext是   重量轻,创建起来并不昂贵。典型的LINQ to SQL   应用程序在方法范围或作为a创建DataContext实例   表示逻辑相关集的短寿类成员   数据库操作。

一个more

  

不要尝试重用DataContext的实例。每个DataContext   维护一个特定的状态(包括身份缓存)   编辑/查询会话。根据当前状态获取新实例   在数据库中,使用新的DataContext

您可以在Rick Strahl的文章Linq to SQL DataContext Lifetime Management中找到更多详细信息。