0

我有一个 MVC Asp.Net 网站。我选择对整个站点使用单个全局连接,但我开始出现“已经为此连接打开了一个 DataReader”错误。所以我选择更改为在每个命令上实例化一个新的 MySQL 连接:

<---------------- With Global Connection ------------>

Public Function Con() As MySqlConnection

    Static _con As MySqlConnection = Nothing
    If _con Is Nothing Then
        _con = New MySqlConnection(ConnectionString)
        _con.Open()
    End If

    Return _con

End Function

Public Function ECN(Query As String) As Integer
    Dim c As New MySqlCommand(Query, Con)
    c.CommandText = Query
    c.ExecuteNonQuery()
    Return CInt(c.LastInsertedId)
End Function

.

<--------------- With A New Connection For Each Command ----->
Public Function ECN(Query As String) As Integer
    Using Con As New MySqlConnection(ConnectionString)
        Con.Open()
        Dim c As New MySqlCommand(Query, Con)
        c.CommandText = Query
        c.ExecuteNonQuery()
        Return CInt(c.LastInsertedId)
    End Using
End Function

文档说性能是相同的,因为连接器使用连接池,但是当我进行基准测试时,差异非常大!

简单的命令:

ECN("insert into teste(nome) values('jackson')")

...在我的本地机器上执行大约需要 50 毫秒,但是当使用全局连接时,执行需要 0(零)毫秒!0毫秒!!!

所以,我做错了什么,或者这种性能差异是真实的,我必须选择?

我在整个站点中调用的唯一方法是 ECN 和 DS:

Public Function DA(Query As String) As MySqlDataAdapter
    Return New MySqlDataAdapter(Query, Con)
End Function

Public Function DS(Query As String) As DataSet
    Using a As MySqlDataAdapter = DA(Query)
        Dim d As New DataSet
        a.Fill(d)
        Return d
    End Using
End Function
4

1 回答 1

0

MySql 连接器和连接池存在一些性能问题。连接器通过从池中打开连接对服务器进行两次往返。

  1. 连接器发送ping 请求
  2. 之后,连接器发送更改数据库请求。

当然,这种行为对已经打开的连接的性能有负面影响。在我看来,这些请求是不必要的,您可以使用自己的修补连接器。

于 2017-08-21T18:59:03.630 回答