Asp.Net MySQL Connector/Net Connection Pool с очень низкой производительностью

У меня есть веб-сайт 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 мс, но при использовании Global Connection для выполнения требуется 0(ноль) мс! 0ms!!!

Итак, я делаю что-то не так, или эта разница в производительности реальна и мне приходится выбирать?

Единственные методы, которые я вызываю на всем сайте, - это 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

1 ответ

Есть некоторые проблемы с производительностью MySql соединителя и пула соединений. Коннектор выполняет два обхода сервера, открывая соединение из пула.

  1. Соединитель отправляет запрос ping.
  2. После этого соединитель отправляет запрос на изменение базы данных.

Конечно, такое поведение негативно влияет на производительность по сравнению с уже открытым соединением. На мой взгляд, эти запросы не нужны, и вы можете использовать свой собственный пропатченный разъем.

Другие вопросы по тегам