2

stackoverflowを初めて使用しましたが、コーディングホラーで開発を続けてきました。

上記のエラーで大きな頭痛がします。ELMAHとGoogleAnalyticsをインストールしましたが、サイトのトラフィックが増えるにつれて、このエラーが発生する回数も増えました。

私はMicrosoftの原則に従うために最善を尽くしました:開発全体を通してhttp://msdn.microsoft.com/en-us/library/ms971481.aspxそして私は全体にわたる複数のアドバイスのソースに基づいてコードを可能な限り最適化しましたウェブ。

SqlConnectionをパブリッククラスに持っています。

Public Class pitstop
Public Shared oConn As New System.Data.SqlClient.SqlConnection
    Public Shared Sub doConnect()
    If oConn.State = ConnectionState.Closed Then
        oConn.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings("pitstopConnectionString").ConnectionString
        oConn.Open()
    End If
End Sub
Public Shared Sub doGarbage()
    oConn.Dispose()
End Sub
' /// other code ///
End Class

そして、私のメインのアプリケーションページでは、これとほとんど同じことをします。

 Private Sub doPump()
    pitstop.doConnect()
    Dim cmd As New System.Data.SqlClient.SqlCommand("doGetCategory", pitstop.oConn)
    Dim dt As New DataTable
    Dim dr As SqlDataReader

    cmd.Parameters.Add("@cat", SqlDbType.Int)
    cmd.Parameters("@cat").Value = CType(Request.QueryString("id"), Integer)

    cmd.CommandType = CommandType.StoredProcedure

    dr = cmd.ExecuteReader()
    While dr.Read()
        If dr.HasRows = True Then
            litCategory.Text = dr("category")
            litCategoryDesc.Text = pitstop.doMakeReadyForHTML(dr("desc"))
        End If
    End While
    cmd = Nothing
    dr.Close()
    pitstop.doGarbage()
End Sub

私はずっとこの方法を使ってきましたが、ほとんどの場合うまくいきますが、今ではサイトがひどく忙しくなり、ドラマが始まりました!誰かアイデアはありますか?

大量のコードを書き直す必要はありませんが、提案は受け付けています。

:)

クリス

4

3 に答える 3

7

接続を共有することが問題です。

接続を共有する必要はなく、発生しているような問題が発生します。.netの接続プールは、舞台裏で実際の接続の共有を処理します。

doPump()で新しい接続を作成するだけです

Private Sub doPump()
    Using Dim conn As New SqlConnection(ConfigurationManager.ConnectionStrings("pitstopConnectionString").ConnectionString)
        Using Dim cmd As New SqlCommand("doGetCategory", conn)
        cmd.CommandType = CommandType.StoredProcedure
        cmd.Parameters.AddWithValue("@cat", CType(Request.QueryString("id"), Integer))
        conn.Open()
        Using Dim dr as SqlDataReader = cmd.ExecuteReader()
            While dr.Read()
                    litCategory.Text = dr("category")
                    litCategoryDesc.Text = pitstop.doMakeReadyForHTML(dr("desc"))
            End While
            dr.Close()
        End Using
    End Using
End Sub
于 2009-05-06T10:54:23.087 に答える
1

あなたのSqlConnectionオブジェクトはSharedです。そしてそれは、その性質上マルチスレッド化されている Web アプリにあります。

データベース アクセス ロジックはコード ビハインド ページにあります。

への呼び出しの前に例外が発生した場合はどうなりpitstop.doGarbage()ますか? 接続が閉じられないか、ぶらぶらしていてあらゆる種類のバグが発生します。

現在のコードに関する限りShared、接続を解除し、データ アクセス ロジックを別のクラスに移動し、リソースを適切に管理します ( Usingステートメントを考えてください)。

于 2009-05-06T10:56:21.990 に答える
0

ピットストップ クラスから「共有」接続を削除して、次のコードを追加しました。ピットストップは、それがプロジェクトの名前であるため、「ピットストップ」と呼ばれます。不適切ですか?皆さんはどのような規則を使用していますか?

doGarbage() 関数を廃止し、接続と使い捨ての「インライン」を呼び出すようになりました。

  Private Sub doPump()
    Dim oConn As New SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("pitstopConnectionString").ConnectionString)
    Dim cmd As New System.Data.SqlClient.SqlCommand("doGetCategory", oConn)
    oConn.Open()

    Dim dt As New DataTable
    Dim dr As SqlDataReader

    cmd.Parameters.Add("@cat", SqlDbType.Int)
    cmd.Parameters("@cat").Value = CType(Request.QueryString("id"), Integer)

    cmd.CommandType = CommandType.StoredProcedure

    dr = cmd.ExecuteReader()
    While dr.Read()
        If dr.HasRows = True Then
            litCategory.Text = dr("category")
            litCategoryDesc.Text = pitstop.doMakeReadyForHTML(dr("desc"))
        End If
    End While
    cmd = Nothing
    dr.Close()

    oConn.Dispose()
End Sub

これは正しいです?

さらに、Anton はクラス内に機能を持たせることは間違っていると述べました - 私は彼がリンクしたドキュメントも読みます - しかし、なぜそれが間違っているのかについての簡単な答えはありますか?

すべての返信に感謝します - 皆さんはとても役に立ちました。

クリス

于 2009-05-06T11:43:22.390 に答える