2

このコードを使用してデータを取得しています:

 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 [クエリ] を使用) は、さまざまな関数で多く使用し、接続を閉じるたびに使用します。データの取得にかかる時間が短縮されるように最適化したいと考えています。それ、どうやったら出来るの?

4

2 に答える 2

5

接続が終了したらすぐに、常に接続を破棄/閉じることをお勧めします。実際には、接続プールは基礎となる物理接続を閉じませんが、この接続が閉じられている場合に再利用可能としてフラグを立てるだけです。したがって、接続を閉じないと再利用できないため、プールは非常に高価な新しい物理接続を作成する必要があります。

したがって、いくつかのマイナーな改善のみ:

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ブロックは使用しないでください。

于 2012-11-26T11:23:36.157 に答える
3

代わりに接続プーリングを使用してください。

デフォルトでは、接続文字列が同じである限り、接続は同じ接続プールから取得されます。

すぐに、接続プールは不要な接続を開いたままにし、次の要求でその接続を返すため、接続を開くのにかかる時間を考える必要はありません。

接続を必要以上に長く開いたままにしておくことは、リソースを消費するため、お勧めできません。また、一般的に一部のサーバーは限られた接続を受け入れることができます。

于 2012-11-26T11:19:32.900 に答える