SqlDataReader vb.net держит соединение открытым

Я использую этот код для получения данных:

 Dim connetionString As String
    Dim connection As SqlConnection
    Dim sqlq As String

    sqlq = "select top 1 * from table1 where smth"

    Dim ds As New DataSet
    connetionString = "Data Source=db;Initial Catalog=ic;User ID=id;Password=pass"
    connection = New SqlConnection(connetionString)

    Try
        Using connection
            Dim command As SqlCommand = New SqlCommand(sqlq, connection)
            connection.Open()
            Dim reader As SqlDataReader = command.ExecuteReader()
            If reader.HasRows Then
                Do While reader.Read()
                    x = reader.GetString(5)
                Loop
            End If
            reader.Close()
        End Using
    Catch ex As Exception
    End Try

Этот тип соединения (с разными sqlq [запросами]) я часто использую в разных функциях и каждый раз закрываю соединение. Я хочу оптимизировать его, чтобы для получения данных требовалось меньше времени. Как я могу это сделать?


person babboon    schedule 26.11.2012    source источник
comment
Это действительно, ужасно плохая идея. Не оставляйте соединение с базой данных открытым дольше, чем вам абсолютно нужно. Рекомендация следующая: открывать как можно позже, делать свою работу, снова закрывать как можно скорее.   -  person marc_s    schedule 26.11.2012
comment
Я думаю, что соединение должно оставаться открытым, пока приложение работает, так как мне нужно как можно скорее получить данные, время здесь очень важно.   -  person babboon    schedule 26.11.2012
comment
Как я уже сказал: это ужасно плохая идея — не делайте этого. Серьезно.   -  person marc_s    schedule 26.11.2012


Ответы (2)


Лучше всего всегда удалять/закрывать соединение, как только вы закончите с ним. На самом деле пул соединений не будет закрыт базовое физическое соединение, но пометить это соединение как повторно используемое только в том случае, если оно закрыто. Поэтому, если вы не закрываете соединение, его нельзя использовать повторно, поэтому пул должен создать новое физическое соединение, что очень дорого.

Итак, только небольшие улучшения:

Const sql = "select top 1 * from table1 where smth"
Dim table As New DataTable()

Using con = New SqlConnection("Data Source=db;Init ....")
    Using command = New SqlCommand(sql, con)
        Using da= New SqlDataAdapter(command)
            da.Fill(table)
        End Using
    End Using
End Using

Вы должны использовать Using для любого объекта, реализующего IDisposable. Вы не должны использовать пустой блок Catch.

person Tim Schmelter    schedule 26.11.2012

Вместо этого используйте пул соединений.

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

Вскоре пул соединений держит ненужные соединения открытыми и возвращает эти соединения при следующем запросе, поэтому вам не нужно думать о времени, необходимом для открытия соединения.

Держать соединения открытыми дольше, чем вам нужно, — плохая идея, потому что это требует ресурсов, и в целом некоторые серверы могут принимать ограниченные соединения.

person Arsen Mkrtchyan    schedule 26.11.2012
comment
Использовать вместо этого пул соединений немного вводит в заблуждение, поскольку по умолчанию пул соединений включен в ADO.NET. - person Tim Schmelter; 26.11.2012
comment
согласен, это включено по умолчанию, я имею в виду не выключать! :) - person Arsen Mkrtchyan; 26.11.2012