第一次使用stackoverflow,但我一直关注它在Coding Horror上的发展。
我对上面的错误感到非常头疼。我已经安装了ELMAH和Google Analytics,随着网站流量的增加,我看到这个错误的次数也增加了。
在整个开发过程中,我已经尽了最大努力遵循微软的原则: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我自始至终都在使用这种方法,而且大多数时候效果都很好,但现在这个网站变得非常忙碌,戏剧已经开始了!有谁有什么想法吗?
我不希望重写堆积如山的代码,但我对建议持开放态度。
:)
克里斯
发布于 2009-05-06 10:54:23
分享你的连接是个问题。
不需要共享连接,也不会像您现在遇到的那样产生问题。.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-06 10:56:22
您的SqlConnection对象是Shared。这是一个web应用程序,它的本质是多线程的。
您的数据库访问逻辑位于代码隐藏页中。
如果在调用pitstop.doGarbage()之前发生异常怎么办?连接要么永远不会关闭,要么会被挂起并导致各种各样的bug。
就您当前的代码而言:取消Shared您的连接,将您的数据访问逻辑移动到一个单独的类,正确地管理资源(考虑Using语句)。
发布于 2009-05-06 11:43:22
我添加了以下代码,将“共享”连接从pitstop类中删除。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提到在类中拥有功能是不正确的-我也会阅读他链接的文档-但是为什么它是错误的,有没有快速的答案?
非常感谢所有的回复-你们都非常有帮助。
克里斯
https://stackoverflow.com/questions/829051
复制相似问题