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 соединителя и пула соединений. Коннектор выполняет два обхода сервера, открывая соединение из пула.
- Соединитель отправляет запрос ping.
- После этого соединитель отправляет запрос на изменение базы данных.
Конечно, такое поведение негативно влияет на производительность по сравнению с уже открытым соединением. На мой взгляд, эти запросы не нужны, и вы можете использовать свой собственный пропатченный разъем.