2

stackoverflow 的第一次用户,但我在 Coding Horror 上关注了它的发展。

我对上述错误感到非常头疼。我安装了 ELMAH 和 Google Analytics,随着网站流量的增加,我看到这个错误的次数也增加了。

我已尽我所能遵循 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. 这是在一个网络应用程序中,它本质上是多线程的。

您的数据库访问逻辑在您的代码隐藏页面中。

如果在调用之前发生异常pitstop.doGarbage()怎么办?连接要么永远不会关闭,要么会一直徘徊并导致各种错误。

就您当前的代码而言:取消Shared连接,将数据访问逻辑移至单独的类,正确管理资源(想想Using语句)。

于 2009-05-06T10:56:21.990 回答
0

我添加了以下代码,从进站类中删除了“共享”连接。Pitstop 被称为“pitstop”,因为这是项目的名称。不合适吗?你们使用什么约定?

我已经废弃了 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 回答