Действительно ли пул соединений улучшает общую производительность? - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть этот код в Visual Basic, каждый раз, когда у меня новая вставка:

Private _conn As SqlConnection 

Public Function Include(ByVal pSql As String, Optional timeout As Integer = 120) As Boolean
   Try
        Dim SQL_Str = "my string of conection... with database. not put on this example"
        _conn = New SqlConnection(SQL_Str)
        _conn.Open()

        _adapter = New SqlDataAdapter

        cmd.CommandTimeout = timeout
        cmd.Connection = _conn
        cmd.CommandText = pSql
        cmd.CommandType = CommandType.Text

        _adapter.InsertCommand = cmd

        _adapter.InsertCommand.ExecuteNonQuery()

    Catch ex As Exception
        InputBox("New Error on Sql cmd: ", , pSql)
    End Try

     _conn.Close()
     _conn.Dispose()
     _conn = Nothing

    _adapter.Dispose()
    _adapter = Nothing
End Function

Хорошо, это простой способ обновить базу данных.

Но предположим, что у меня есть 1000 соединений одновременно, будет ли приложение поддерживать такой подход?

Поддерживает ли этот метод одновременные потоки, обрабатывающие объект _conn?

Действительно ли необходимо создавать пул соединений для обработки данных?

Действительно ли пул соединений что-то улучшит?

например. с этим я перегружаю приложение вместо базы данных?

Если так, как бы я сделал это на VbNet / Visual Basic?

1 Ответ

0 голосов
/ 05 ноября 2018

Да , пул соединений действительно быстрее. Они избавляют вас от необходимости постоянно пересматривать информацию о входе в систему и протоколе. Более того, это уже встроено в тип SqlConnection и сделано достаточно поточно-ориентированным способом (где существующий код не ).

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

Учитывая это, я вижу несколько больших проблем в этом коде:

  1. Обработка переменной _conn уровня класса как локальной, что делает невозможным безопасное совместное использование экземпляров этого класса между потоками.
  2. Нет механизма для очистки соединения, если выброшено исключение (нужен блок Finally или Using. Просто закрытие после Catch недостаточно хорошо.
  3. Нет способа передать отдельные параметры запроса в сигнатуру функции. Это заставит вас писать ужасно небезопасный код в другом месте, которое безумно уязвимо для атак инъекций SQL. Это одна из тех вещей, когда вы просыпаетесь однажды утром, чтобы узнать, что вас взломали более года назад, а ИМО граничит с профессиональной халатностью.
  4. Смешивание кода пользовательского интерфейса с кодом утилиты.

Вы хотите что-то похожее на это:

Private cnString As String = "my string of conection... with database. not put on this example"

Public Sub Include(pSql As String, parameters() As SqlParamter, Optional timeout As Integer = 120)
   Using conn As New SqlConnectioN(cnString), _
         cmd As New SqlCommand(pSql, conn)

        If parameters IsNot Nothing AndAlso parameters.Length > 0 Then
            cmd.Parameters.AddRange(parameters)
        End If

        conn.Open()
        cmd.ExecuteNonQuery()
    End Using
End Sub

И вы могли бы назвать это так (при условии, что тип или имя экземпляра DB):

Dim pSql As String = "INSERT INTO [ExampleTable] (FirstName, LastName, CreationDate) VALUES (@FirstName, @LastName, @CreationDate)"
Dim parameters = {
    New SqlParameter("@FirstName", SqlDbType.NVarChar, 20),
    New SqlParameter("@LastName", SqlDbType.NVarChar, 20),
    New SqlParameter("@CreationDate", SqlDbType.DateTime)
}
parameters(0).Value = "John"
parameters(1).Value = "Smith"
parameters(2).Value = DateTime.Now

Try
    DB.Include(pSql, parameters)
Catch ex As Exception
    MessageBox.Show(String.Format("New Error on Sql cmd:{0}{1}{0}{0}Message:{2}",vbCrLf, pSql, ex.Message)
End Try
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...