2015-02-04 3 views
0

У меня есть веб-сайт MVC Asp.Net. Я решил использовать одно глобальное соединение со всем сайтом, но у меня появляется ошибка «Есть уже ошибка DataReader для этого соединения». Поэтому я решил изменить для создания нового соединения MySQL по каждой команде:Asp.Net MySQL Connector/Net Connection Pool с очень низкой производительностью

<---------------- 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 
+0

Вы использовали 'ExecuteReader' где-нибудь еще в приложении? –

+0

Нет. Никогда не использовал ExecuteReader. Может быть, Connector/Net называет его любым из своих методов? Единственными методами, которые я называю, являются ECN и DS *. Я обновил исходное сообщение, включая метод DS. –

ответ

0

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

  1. Разъем отправляет ping request.
  2. После этого соединитель отправляет запрос change the database.

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