繁体   English   中英

是否有可能使用LINQ获取SQL连接泄漏?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM