我们使用(共享)SQL Server数据库在ASP.NET 4.5上运行一个站点。我们的ISP最近告诉我们,我们有太多的开放连接,它正在影响服务器的整体稳定性。在高负载时,此数字可以达到多达400多个开放连接,大约200个并发用户访问该站点。
该网站主要由评论和博客文章等内容组成,我们在整个网站上实施了缓存。我们专门使用Entity Framework来查询数据库。我们使用StructureMap将连接字符串注入到业务逻辑类中。
StructureMap初始化:
var ecsbuilder = new EntityConnectionStringBuilder();
ecsbuilder.Provider = "System.Data.SqlClient";
ecsbuilder.ProviderConnectionString = @"data source=***;initial catalog=***;persist security info=True;User ID=***;Password=***;multipleactiveresultsets=True;App=EntityFramework";
ecsbuilder.Metadata = @"res://*/Data.***.csdl|res://*/Data.***.ssdl|res://*/Data.***.msl";
string connectionString = ecsbuilder.ToString();
For<SiteModelContainer>().Use<SiteModelContainer>().Ctor<string>("connectionString").Is(connectionString);
For<IGalleryService>().Use<GalleryService>();
...all the rest of our services
然后在我们的服务中(例如GalleryService
),我们有以下内容:
private readonly SiteModelContainer _context;
public GalleryService(SiteModelContainer context)
{
this._context = context;
}
在我们的服务方法中,我们只使用_context
来查询数据库
我的问题是:
由于
答案 0 :(得分:0)
使用块来使用上下文。
//创建一个类和静态函数来获取上下文
public class DaatabaseFramework
{
public static SiteModelContainer GetContext()
{
return new SiteModelContainer();
}
}
//使用以下内容来使用上下文
using (var context=DaatabaseFramework.GetContext())
{
}
答案 1 :(得分:0)
当我尝试从使用(... connection ...){}块传递IQueryable变量时,我看到了相似的内容。
当我这样做时,孤立的连接就像你一样留在我的网站上。
尝试找到这样的代码:
public IQueryable<YourClass> func(int param1) {
using(var context=DaatabaseFramework.GetContext()) {
return context.MyTable.Where(_=>_.Param1==Param1);
}
}