Истекло время ожидания получения страницы ASP.NET, что требовало перезапуска пула приложений каждый час - PullRequest
0 голосов
/ 20 сентября 2019

Моя новая страница приложения получает ошибку тайм-аута каждый час или около того после получения трафика на странице, и под трафиком я подразумеваю, что пользователи подают 5-10 приложений.Как мне найти причину связывания соединений?

Это было проблемой в прошлом, поэтому всякий раз, когда я использую объект чтения данных sql, я обязательно выполняю инструкцию «Using».Я также позаботился о том, чтобы поток не был прерван до того, как устройство чтения данных будет удалено.Я сомневаюсь, что мое использование читателей данных является проблемой, поэтому, возможно, это мой код, не связанный с запросом, который вызывает проблему, но я не могу понять, почему.

Я также использую несколько объектов sqldatasource для своих элементов управления выпадающего списка, и, насколько я знаю, это не будет источником моей проблемы.

См. Пример кода, чтобы узнать, как я использую свой sqlobjects.

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
    Using drApp As SqlDataReader = LookupAppByID()
            'some code
        drApp.Close()
    End Using
End Sub

Public Function LookupAppByID() As SqlDataReader
    Dim Command As New SqlClient.SqlCommand

    Command.Connection = GetDBConnection()
    Command.CommandType = CommandType.Text
    Command.CommandText = "select statement"

    Return Command.ExecuteReader(CommandBehavior.CloseConnection)
End Function

Public Function UpdateAppStatus() As Integer
    UpdateAppStatus = 0
    Using Command As New SqlClient.SqlCommand("update statement", GetDBConnection())
        UpdateAppStatus = Command.ExecuteNonQuery()

        Command.Connection.Close()
        Command.Connection.Dispose()
        Command.Dispose()
    End Using
End Function

Public Function GetDBConnection() As SqlClient.SqlConnection
    Dim connection As New SqlClient.SqlConnection
    connection.ConnectionString = "connection string"
    connection.Open()
    Return connection
End Function

Очевидно, я ожидаю, что он пойдет без помех, но когда пользователи начинают нажимать на страницу, появляется такая ошибка: истекло время ожидания.Время ожидания истекло до получения соединения из пула.Это могло произойти из-за того, что все пулы подключений использовались и был достигнут максимальный размер пула.

Есть ли проблема с моим кодом?Как я могу определить причину этой проблемы?

1 Ответ

0 голосов
/ 21 сентября 2019

Я бы оставил объекты базы данных локальными, чтобы обеспечить их закрытие и удаление.Создавайте и размещайте в одном методе.Я создал класс, чтобы вы могли легко передать все его свойства в одной переменной.

'User Interface Code
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim id As Integer 'No sure where the value comes from
    Using dtApp As DataTable = DataAccess.LookupAppByID(id)
        'some code
    End Using
End Sub

Protected Sub Update_Click(sender As Object, e As EventArgs) Handles Update.Click
    Dim Applic As New ApplicationData()
    Applic.ApplicantsName = txtName.Text
    Applic.ID = CInt(txtID.Tex)
    Applic.ApplicationStatus = "Approved"
    Dim retVal = DataAccess.UpdateAppStatus(Applic)
    If retVal = 1 Then
        'Alert user of success
    Else
        'Alert user of failure
    End If
End Sub

Public Class ApplicationData
    Public Property ID As Integer
    Public Property AppDate As Date
    Public Property ApplicantsName As String
    Public Property ApplicationStatus As String
End Class

Public Class DataAccess
    Private Shared ConString As String = "Your connection string"
    Public Shared Function LookupAppByID(AppID As Integer) As DataTable
        Dim dt As New DataTable
        Using cn As New SqlConnection(ConString)
            Using Command As New SqlCommand("select * From YourTable Where ID = @ID", cn)
                Command.Parameters.Add("@ID", SqlDbType.Int).Value = AppID
                cn.Open()
                dt.Load(Command.ExecuteReader)
            End Using
        End Using
        Return dt
    End Function

    Public Shared Function UpdateAppStatus(App As ApplicationData) As Integer
        Dim AppStatus = 0
        Using cn As New SqlConnection(ConString)
            Using Command As New SqlClient.SqlCommand("Update YourTable Set Status = @Status Where ID = @ID;", cn)
                Command.Parameters.Add("@Status", SqlDbType.VarChar, 50).Value = App.ApplicationStatus
                Command.Parameters.Add("@ID", SqlDbType.Int).Value = App.ID
                cn.Open()
                AppStatus = Command.ExecuteNonQuery()
            End Using
        End Using
        Return AppStatus
    End Function
End Class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...