实体框架 - 保留数据库上下文打开与不断重新创建

时间:2014-08-28 13:48:15

标签: .net vb.net entity-framework

我有一个相当简单的Winforms / Entity Framework(v6)程序:

  1. 查询数据库以填充表单元素
  2. 用户点击后,重新查询数据库以获取相关信息
  3. 对该信息执行计算并将其显示给用户
  4. 作为一名EF新手,我试图跟踪我在网上发现的事情的例子,并提出了一些相当简单的东西来填充/查询:

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Using ctx As New MyEntities
                <Query DB to populate initial values for first combobox>
        End Using
    End Sub
    
    Private Sub cboVal1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboVal1.SelectedIndexChanged
        Using ctx As New MyEntities
             <Queries to populate the other controls based upon user selections>
         End Using
    End Sub
    
    Private Sub Button_Press(sender As Object, e As EventArgs) Handles MyButton.Click
         Using ctx As New MyEntities
             <Queries to get data, based upon user selections for calculations>
         End Using
    End Sub
    

    我发现的是,这部分似乎正在减慢我的程序(如果我对此错误的话,请纠正我 - 正如我所说,我是我每次使用:

    时重新建立一个新的数据库连接
    Using ctx As New MyEntities
        ...
    End Using
    

    在我的代码中。

    所以,我正在考虑做的是拥有一个表单级变量ctx as MyEntities - 在表单加载上建立连接并关闭表单上的连接并始终使用相同的连接。有些东西:

    Dim ctx as MyEntities
    
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ctx = New MyEntities
    
        <Query ctx to populate initial values for first combobox>
    End Sub
    
    Private Sub cboVal1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboVal1.SelectedIndexChanged
        <Queries ctx to populate the other controls based upon user selections>
    End Sub
    
    Private Sub Button_Press(sender As Object, e As EventArgs) Handles MyButton.Click
         <Queries ctx to get data, based upon user selections for calculations>
    End Sub
    
    Private Sub Main_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        ctx.Dispose()
        ctx = Nothing
    End Sub
    

    当我以这种方式切换工作时,它似乎已经大大提高了速度,我意识到它让我可能对数据库进行不良更改,但这是一个小项目,没有做任何更新 - 只是查询......这是一个合理的解决方案还是这是一种危险的做事方式?

1 个答案:

答案 0 :(得分:6)

数据库连接通常会在几乎任何现代查询工具的连接池中汇集。这看起来很像线程池;将打开一定数量的连接,并且每当创建新的上下文并请求连接时,它将被独占使用其中一个现有连接。当处理上下文时,连接不会被关闭,它只会被返回到连接池。

因此,没有必要尝试长时间手动保持上下文活动。只需一次操作就可以使用它们。

当然,如果您明确表示不希望发生连接池,则可以禁用连接池,但很少有理由这样做。