iis 7.5应用程序池问题失败

时间:2015-01-08 11:16:31

标签: asp.net iis iis-7

我一直在我们的网站上工作,偶尔我们会得到奇怪的结果。 IIS应用程序池似乎有问题,数据库连接失败。我检查数据库,一切都很好&如果我在数据库中运行sql语句它的闪电速度很快。然后,在第一次失败之后,每个人都将无法连接到数据库,直到我回收IIS应用程序池。

我正在检查我的代码是否存在内存泄漏。

我确实注意到,当我登录并在今天早上5点开始工作时,内存使用率为77%,现在没有人登录,在我对系统进行压力测试之前。现在我知道这个盒子上有sql server,所以会占用尽可能多的内存。我想知道是否应该添加更多内存并将sql限制为现在的内容,并允许新内存用于IIS。

是否有人是IIS专家,特别是IIS应用程序池设置?

这是我用于调用数据库的代码:

dim strU_TmRecord5 as string
strU_TmRecord5 = "Some sql query..."
strSaveSuccessful = exExecuteNonQuery(strU_TmRecord5, "ConnectDBSettings", strUser)



Public Shared Function exExecuteNonQuery(ByVal sqlString As String, ByVal strConnName As String, Optional ByVal strUser As String = "") As Object

    Dim strConnString As String = ConfigurationManager.ConnectionStrings(strConnName).ConnectionString
    Dim sqlConnection1 As New SqlConnection(strConnString)
    Dim returnValue As String = "FAIL"
    Dim cmd As New SqlCommand

    '  NonQuery does not return any data
    Try
        cmd.CommandText = sqlString
        cmd.CommandType = Data.CommandType.Text
        cmd.Connection = sqlConnection1

        sqlConnection1.Open()
        cmd.ExecuteNonQuery()
        returnValue = "SUCCESS"
        sqlConnection1.Close()

    Catch ex As Exception
        returnValue = "FAIL"
        If sqlConnection1 IsNot Nothing Then
            sqlConnection1.Close()
        End If

    Finally
    End Try

    Return returnValue

End Function

这是DataReader的代码:

    Dim drDataReader1 As SqlDataReader = Nothing
    Dim strGetMgrInfo as string = "sql stuff to get mgr info"

  Try
        Dim drDataReader As SqlDataReader
        ddlMgrName.Items.Clear()
        drDataReader = Utilities.exExecuteDataReader(strGetMgrInfo, "DBConnect", strUser)

        If drDataReader.HasRows = False Then
            lblError1.Visible = True
            lblError1.Text = "Invalid Employee Info"
        Else
            While drDataReader.Read()
                ddlMgrName.Items.Add(New ListItem(drDataReader(0).ToString.Trim, drDataReader(1).ToString.Trim))
            End While
            drDataReader.Close()
        End If
    Catch ex As Exception
    Finally
    End Try



Public Shared Function exExecuteDataReader(ByVal sqlString As String, ByVal strConnName As String, Optional ByVal strUser As String = "") As SqlDataReader

    Dim returnValue As SqlDataReader = Nothing

    '  Scalar gets 1st column of 1st row no matter how many records are returned.
    Dim strConnString As String = ConfigurationManager.ConnectionStrings(strConnName).ConnectionString
    Dim sqlConnection1 As New SqlConnection(strConnString)
    sqlConnection1.Open()

    Dim cmd As New SqlCommand
    exExecuteDataReader = Nothing

    cmd.CommandText = sqlString
    cmd.CommandType = Data.CommandType.Text
    cmd.Connection = sqlConnection1

    Try
        returnValue = cmd.ExecuteReader(Data.CommandBehavior.CloseConnection)
        Return returnValue
    Catch ex As Exception
        If sqlConnection1 IsNot Nothing Then
            sqlConnection1.Close()
        End If

    End Try

End Function

1 个答案:

答案 0 :(得分:0)

在任何生产系统的同一个盒子上运行IIS和SQL是个坏主意。 SQL可以限制其内存使用。 IIS没有那么多(你可以给它一个限制,但它会在你的应用程序每次结束时重击,这可能不是你想要的)。

内存泄漏是首先要检查的内容,但您还应该确保不会泄漏数据库连接。你必须关闭/处置这些,否则你将体验到你所看到的。

此外,从第二个查询函数返回的DataReader需要连接,因此您可以返回同时包含DataReaderSqlConnection的一次性对象,并依赖于调用者处置我不推荐这个,或者你可以将数据从DataReader复制到一个自定义对象(如ORM系统),DataTable对象或其他一些对象。第二种方法更可取,因为它尽可能快地捕获数据,然后释放连接以供其他请求使用。第一种方法仅用于返回的数据太多而无法合理保存在内存中的情况。即使在这种情况下,传递某种处理委托并在该函数中的每一行都有一个更好的设计。