我有一个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)
在我的业务逻辑中,在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重复 - 但如果我重新加载它就消失了。
在此页面上,我从未使用过分析器运行,因为加载时间问题我无法识别它使用的SQL。
我错过了什么吗? SQL缓存了吗?我总是希望看到SQL,即使Linq2Sql缓存它或其他什么。我做错了什么?
答案 0 :(得分:2)
您的MyOrders
课程中有静态数据上下文。 DataContext
内部有一个内部缓存,用于跟踪实体的更改,避免在一个业务事务中往返数据库。将其保持为静态意味着内部缓存将暂时增加并且未正确释放。这可能是分析器中查询消失的原因。此外,当多个用户从多个线程访问相同的上下文时,您可能会遇到问题,并且可能是内存泄漏。
来自MSDN的说明:
通常,
DataContext
实例设计为持续一个“单位” 工作“但是你的应用程序定义了这个术语.DataContext是 重量轻,创建起来并不昂贵。典型的LINQ to SQL 应用程序在方法范围或作为a创建DataContext
实例 表示逻辑相关集的短寿类成员 数据库操作。
一个more:
不要尝试重用
DataContext
的实例。每个DataContext
维护一个特定的状态(包括身份缓存) 编辑/查询会话。根据当前状态获取新实例 在数据库中,使用新的DataContext
。
您可以在Rick Strahl的文章Linq to SQL DataContext Lifetime Management中找到更多详细信息。