我相信在使用LINQ时不可能得到sql连接泄漏,但NumberOfReclaimedConnections的perfmon跟踪显示高数字,在高负载时,我们有时会得到“Timeout expired”等异常.在从池中获取连接之前已经过了超时时间.这可能是因为所有池连接都在使用中并且达到了最大池大小“.
我们不在datacontexts上使用Dispose,因为我们使用了deferred loading.一些文章和博客文章告诉我,这应该不是问题.
我们有时会得到这些例外.但是,我们所做的每个linq查询都不能保持连接打开,那么我们就会有更多的异常.
编辑
该应用程序是一个WCF服务.
如果您查看Linq和大多数文章的文档,他们声称不需要Dispose来释放连接.他们声称DataCOntext只在需要的短时间内保持连接打开.
解决方法
当您的DataContext未被处理并保持活动状态时,关联的连接也将保持活动状态.数据库连接是非托管资源,必须正确处理所有非托管资源.
即使您使用延迟加载并且没有明确定义的范围,您仍应在逻辑工作单元结束时清理数据库连接.在ASP.NET应用程序中,最新的可能时刻是在请求处理结束时 – 在Globals.asax文件的Application_EndRequest方法中.在WCF服务中,应在每个服务方法调用结束时处理任何活动数据上下文.
这方面的文档含糊不清,虽然大部分时间都没有处理DataContext,但似乎确实存在从连接加载的数据保持连接本身存在的一些场景.确认在您的情况下发生这种情况的最简单方法是测试它.