实体框架打开连接

时间:2014-09-04 04:54:17

标签: c# sql asp.net entity-framework

我们使用(共享)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来查询数据库

我的问题是:

  1. 如果这是我们查询数据库的唯一方法是不是因为某种原因关闭连接?
  2. 我可以使用哪些方法来确定连接的打开位置?
  3. 由于

2 个答案:

答案 0 :(得分:0)

  1. 在连接字符串中使用连接池。
  2. 使用块来使用上下文。

    //创建一个类和静态函数来获取上下文

    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);
  }
}