C# 实体框架开放连接

C# 实体框架开放连接,c#,sql,asp.net,entity-framework,C#,Sql,Asp.net,Entity Framework,我们有一个网站运行在ASP.NET 4.5上,使用(共享)SQL Server数据库。我们的ISP最近告诉我们,我们有太多的开放连接,这影响了服务器的整体稳定性。在高负载情况下,这个数字可以达到400多个开放连接,大约有200个并发用户访问该站点 该网站主要由评论和博客文章等内容组成,我们在整个网站上实施了缓存。我们专门使用实体框架来查询数据库。我们使用StructureMap将连接字符串注入到业务逻辑类中 StructureMap初始化: var ecsbuilder = new Entity

我们有一个网站运行在ASP.NET 4.5上,使用(共享)SQL Server数据库。我们的ISP最近告诉我们,我们有太多的开放连接,这影响了服务器的整体稳定性。在高负载情况下,这个数字可以达到400多个开放连接,大约有200个并发用户访问该站点

该网站主要由评论和博客文章等内容组成,我们在整个网站上实施了缓存。我们专门使用实体框架来查询数据库。我们使用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
在我们的服务方法中,我们只使用
\u context
查询数据库

我的问题是:

  • 如果这是我们查询数据库的唯一方法,那么它不是出于某种原因关闭连接吗
  • 我可以使用什么方法来确定连接保持打开的位置
  • 谢谢

  • 在连接字符串中使用连接池
  • 使用using block来使用上下文,如下所示

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

    public class DaatabaseFramework
    {
        public static SiteModelContainer GetContext()
        {
            return new SiteModelContainer();
        }
    }
    
    using (var context=DaatabaseFramework.GetContext())
    {
    
    }
    
    //使用下面的命令来使用上下文

    public class DaatabaseFramework
    {
        public static SiteModelContainer GetContext()
        {
            return new SiteModelContainer();
        }
    }
    
    using (var context=DaatabaseFramework.GetContext())
    {
    
    }
    

  • 当我试图通过使用(…连接…{}块传递IQueryable变量时,我看到了类似的情况

    当我这么做的时候,孤立的连接就像你的一样留在我的网站上

    尝试查找如下代码:

    public IQueryable<YourClass> func(int param1) {
      using(var context=DaatabaseFramework.GetContext()) {
        return context.MyTable.Where(_=>_.Param1==Param1);
      }
    }
    
    public可查询函数(int参数1){
    使用(var context=DaatabaseFramework.GetContext()){
    返回context.MyTable.Where(=>u.Param1==Param1);
    }
    }
    
    这也发生在我身上,尽管我使用了“using”语句,但无法找到连接泄漏的位置。连接池应该会有所帮助。如果可能的话,也可以考虑重新设计缓存计划。如果操作得当,缓存应该能够删除大量对数据库的后端调用。@MairajAhmad我觉得StructureMap会自动处理上下文?我没有使用它。