【问题标题】:Excessive SQL Server processes for Entity Framework based application基于实体框架的应用程序的 SQL Server 进程过多
【发布时间】:2011-06-27 13:20:41
【问题描述】:

我们目前正在开发基于 WPF/Entity-Framework 的应用程序。我们的要求之一是允许用户选择他们在登录时将连接到的环境(测试、培训或生产)。每个连接选项都指向自己的数据库。为此,我们通过以下方式创建新的 EF 上下文:

Public Function NewVectorContext() As VectorEntities
    Dim strDBConn As String = "metadata=res://*/EntityFramework.VectorModel.csdl|res://*/EntityFramework.VectorModel.ssdl|res://*/EntityFramework.VectorModel.msl;provider=System.Data.SqlClient;provider connection string=""" & VectorConnectionString & """"

    Dim EntityConn As System.Data.EntityClient.EntityConnection = New System.Data.EntityClient.EntityConnection(strDBConn)

    Dim MyNewContext as VectorEntities = New VectorEntities(EntityConn)
    MyNewContext.ContextOptions.LazyLoadingEnabled = False

    Return MyNewContext
End Function

VectorConnectionString 以标准 SQL Server 方式格式化:

Data Source=OurDBServer;Initial Catalog=OurAppDB;Persist Security Info=True;User ID=OurUserId;Password=OurPassword

并在运行时由用户的选择(测试、培训、产品)确定。

我们已确保所有新上下文在其工作完成后都会被释放。

问题是这样的:当用户使用应用程序时,我们会在 SQL Server 的活动监视器中看到数百个 SQL Server 进程。一些个人用户在使用该应用程序时关联了超过 30 多个进程。一旦用户关闭应用程序,相关进程就会全部消失 - 但在应用程序运行时,这些进程似乎会一直存在。

【问题讨论】:

  • 问题半固定:我们的视图模型和模型并不总是被正确处理,片段显然仍然停留在内存中,这表明在 SQL Server 活动监视器中看到大量进程。通过适当的处理,我们看到创建的 sql server 进程减少了,但仍然有大量正在创建的进程 - 这正常吗?

标签: .net sql-server vb.net entity-framework


【解决方案1】:

已修复 - 正如我在上面提到的,解决方案的一部分是正确的内存管理,并确保所有模型和视图模型都得到正确处理。但这仅消除了我们所看到的少数 sql server 进程。罪魁祸首是一个设计不当的模型基类,它为每个被实例化的模型创建了多个上下文。改写后问题就解决了。与 EF 无关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2011-03-19
    • 1970-01-01
    • 2012-09-14
    • 2015-11-18
    • 1970-01-01
    相关资源
    最近更新 更多