.net – 实体框架遇到的最大池大小4.3

前端之家收集整理的这篇文章主要介绍了.net – 实体框架遇到的最大池大小4.3前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这将是一个很长的帖子,所以请挂在我身边.

我在几个月前在这里工作的生产站点之一,我经常在我们的ELMAH日志中看到可怕的连接泄漏错误消息.

"Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached."

这使我很困惑,因为我们正在使用EF,连接处理应该是自动的.

所以我开始挖.我认为第一个潜在的罪魁祸首是MiniProfiler(或者我应该说,我们实施使用miniprofiler).我们一直在使用它,它一直运行良好,但我担心潜在的连接泄漏.

public OurContext() : base(GetProfilerConnection(),true)
    {}

    private static DbConnection GetProfilerConnection()
    {
        return new EFProfiledDbConnection(new sqlConnection(ConfigurationManager.ConnectionStrings["Database"].ConnectionString),MiniProfiler.Current);
    }

我的印象是,基本调用中的“true”参数导致上下文获取连接的所有权,所以我认为这应该正常工作,连接将被处理.

在我们的增强DEV分支中,我删除了miniprofiler,因为它没有被更新以支持EF5,我们将在不久的将来的某个时间进行迁移,所以这应该被删除.

关注二是“我们妥善处理我们的数据指纹”?所以我下载了实体框架事件探查器,并尝试了最重的页面并进行了测试.

结果显示,我们开放的任何语境都是关闭的,然而关于我的部分是我们开放的上下文的数量.我们有我们的DI容器(Ninject 2)设置来设置每个Web http请求的一个上下文
考虑正确.问题在于我们如何处理我们的应用程序中的图像.该页面特别可以在数据库中最多有七个图像.这些图像中的每一个都通过MVC动作包含在页面中.
像这样:

[<img src="/Controller/GetPhotoAction/[ImageId] />]

由于图像是separte请求,因此单独的上下文正在打开.所以,对于这个特定的页面,如果我正确地理解了这个页面,我们正在使用来自连接池的七个不同的连接.不管多少用户,我都看到这个
上面的错误信息如何才能成立.

数据库中存储图像的原因有两个.一,我们管理这个应用程序的数据的管理应用程序在美国西海岸,但托管应用程序的服务器位于美国东海岸.有一个
我们的网络之间的VPN隧道在这里在西海岸和东海岸的服务器上工作.该应用程序也负载均衡(2个Web前端).决定将图像存储在数据库中以避免复制图像
然后通过VPN隧道处理将图像写入到每个服务器上的Web应用程序中的文件位置的权限(两个位置也是完全不同的域).

在此期间,当我们测试时,我们已经在连接字符串中增加了最大连接池大小,并将在下周初将其部署到PROD.

所以我的问题是:

1)我在这里填写了泄漏检查基地吗?我相信我有.我上面提到的任何事情我错了吗?

2)如果这个页面上的多个数据上下文被证明是罪魁祸首,那么关于如何将图像写入全国两个服务器的建议,请注意权限将跨域?实际上,我想这样做,
但技术障碍比假期之前在这个时候愿意做的更多一些.

3)如果你认为上述都不是问题,我可以失踪什么?是否真的要求要求足够高,我们遇到这个错误,我们需要扩展?我可以挖掘日志来查看使用统计信息,但是
似乎不太可能.此页面缓存了一个小时(有一个不同的param)

解决方法

有更多的方法来确定您的网络应用程序是否泄漏连接.最近我受益于使用这些:

>使用sql分析器(您可以看到打开/关闭的连接数)
>在IIS上监视连接池 – 看这里更多 – http://msdn.microsoft.com/en-us/library/aa175863%28SQL.80%29.aspx
>将连接字符串中的Max Pool Size设置为您期望的一个请求的连接的最大值 – 我尝试运行我的应用程序,它使用与在页面上使用Max Pool Size = 1存储和检索图像相同的方法,超过10个图像,它失败了与你有同样的例外.当我每个请求删除了嵌套连接的错误,即使图像上的这些子请求也是可以的.

和你的问题你应该对每个请求有一个数据上下文.当它被绑定到请求范围时,它将被处理在请求的结尾(实际上它被延迟直到垃圾收集器收集请求对象).但请注意,如果您没有直接使用您的数据文本(例如,您有一些存储库模式包装),因为可能存在一些隐藏(连接泄漏)错误.

猜你在找的asp.Net相关文章