[英]Is it possible to gets sql connection leaks using LINQ?
我相信在使用LINQ时不可能得到sql连接泄漏,但NumberOfReclaimedConnections的perfmon跟踪显示高数字,在高负载时,我们有时会得到“Timeout expired”之类的异常。在从池中获取连接之前已经过了超时时间。这可能是因为所有池连接都在使用中并且达到了最大池大小“。
我们不在datacontexts上使用Dispose,因为我们使用了deferred loading。 一些文章和博客文章告诉我,这应该不是问题。
我们有时会得到这些例外。 但是,我们所做的每个linq查询都不能保持连接打开,那么我们会有更多的异常。
编辑
该应用程序是一个WCF服务。
如果您查看Linq和大多数文章的文档,他们声称不需要Dispose来释放连接。 他们声称DataCOntext只在需要的短时间内保持连接打开。
当您的DataContext
未被处理并保持活动状态时,关联的连接也将保持活动状态。 数据库连接是非托管资源,必须正确处理所有非托管资源。
即使您使用延迟加载并且没有明确定义的范围,您仍应在逻辑工作单元结束时清理数据库连接。 在ASP.NET应用程序中,最新的可能时刻是在请求处理结束时 - 在Globals.asax文件的Application_EndRequest方法中。 在WCF服务中,应在每个服务方法调用结束时处理任何活动数据上下文。
这方面的文档含糊不清,虽然大部分时间都没有处理DataContext,但似乎确实存在从连接加载的数据保持连接本身存在的一些场景。 确认在您的情况下发生这种情况的最简单方法是测试它。
经过一番搜索后我发现了这个问题和答案 ,其中说linq可以被愚弄以保持连接打开..
我制作了这个重现它的小测试代码。 如果我只是用foreach替换Enumerator它工作正常,但他Enumerator保持连接打开。
public Organisation RunTestQuery2()
{
IEnumerable<Organisation> orgs = base.GetEntities<Organisation>().Take(5);
var enumerator = orgs.GetEnumerator();
int i = 0;
while (enumerator.MoveNext())
{
var org = enumerator.Current;
Debug.WriteLine(org.DescribingName);
if (i == 3)
{
return org;
}
i++;
}
return null;
}
如果我在上下文中添加一个处理调用,它们会消失。
您是否在数据库中遇到任何死锁? 快速查看活动监视器应该给你一些指示。
您如何管理DataContext生命周期 - 您编写了哪种应用程序(网站,Windows客户端,其他)?
一旦在查询或操作中使用,DataContext将保持连接,以便加载的实体可以延迟加载等,因此您必须规划在应用程序中使用DataContexts的方式。
WCF服务..在这种情况下,我是“每个请求一个上下文”方法的忠实粉丝。 我建议您将数据操作包装在using()语句中,以便在完成后处理上下文。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.